PHP ile ChatGPT Benzeri Basit Chatbot Yapımı
PHP ChatGPT chatbot uygulaması, tarayıcıdaki mesajı PHP sunucusuna gönderip OpenAI Responses API’den alınan yanıtı kullanıcıya gösteren basit bir mimariyle kurulabilir. API anahtarı hiçbir zaman JavaScript’e veya HTML’e yazılmaz; yalnızca sunucu tarafında ortam değişkeninden okunur.
Bu rehber eğitim amaçlı küçük bir örnektir. OpenAI’nin resmî API başlangıç belgesi anahtarın güvenli saklanmasını ve sunucu ortamında kullanılmasını gösterir. Yeni projeler için Responses API önerilmektedir.
PHP ChatGPT Chatbot Mimarisi

- Kullanıcı tarayıcıdaki forma mesaj yazar.
- JavaScript mesajı kendi PHP uç noktanıza JSON olarak gönderir.
- PHP girdiyi doğrular, oturum geçmişini hazırlar ve Responses API’yi çağırır.
- PHP yalnızca gerekli yanıt metnini tarayıcıya döndürür.
- Arayüz yanıtı güvenli biçimde metin olarak gösterir.
Benzer sunucu tarafı entegrasyon örnekleri için AI API rehberlerine de bakabilirsiniz.
ChatGPT, son kullanıcı ürününün adıdır; uygulamada OpenAI API üzerinden erişilebilen bir model kullanılır. Güncel ve hesabınızda açık model kimliğini resmî model kataloğundan kontrol edin.
1. Proje ve Ortam Değişkenleri
chatbot/
├── public/
│ ├── index.html
│ └── chat.php
└── .env.example
Gerçek anahtarı web kökünün dışında veya hosting sağlayıcınızın gizli değişken alanında saklayın. Örnek değişkenler:
OPENAI_API_KEY=buraya-gercek-anahtar
OPENAI_MODEL=gpt-5.6-luna
.env dosyasını Git’e eklemeyin. Paylaşımlı hosting ortamında değişken tanımlama yöntemi sağlayıcıya göre değişir. Model adı yalnızca örnektir; uygulamayı kurduğunuz gün model kataloğunu doğrulayın.
2. PHP ChatGPT Chatbot Responses API Çağrısı

public/chat.php dosyası aşağıdaki gibi hazırlanabilir:
<?php
declare(strict_types=1);
session_start();
header('Content-Type: application/json; charset=utf-8');
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['error' => 'Yalnızca POST desteklenir.']);
exit;
}
$body = json_decode(file_get_contents('php://input'), true);
$message = trim((string)($body['message'] ?? ''));
if ($message === '' || mb_strlen($message) > 2000) {
http_response_code(422);
echo json_encode(['error' => 'Mesaj 1-2000 karakter olmalıdır.']);
exit;
}
$apiKey = getenv('OPENAI_API_KEY');
$model = getenv('OPENAI_MODEL') ?: 'gpt-5.6-luna';
if (!$apiKey) {
http_response_code(500);
echo json_encode(['error' => 'Sunucu yapılandırması eksik.']);
exit;
}
$history = $_SESSION['chat_history'] ?? [];
$history[] = ['role' => 'user', 'content' => $message];
$history = array_slice($history, -10);
$payload = [
'model' => $model,
'instructions' => 'Türkçe, açık ve kısa yanıt ver. Emin olmadığın bilgiyi kesinmiş gibi sunma.',
'input' => $history,
'max_output_tokens' => 500,
];
$ch = curl_init('https://api.openai.com/v1/responses');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 45,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
]);
$raw = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
curl_close($ch);
if ($raw === false || $curlError !== '') {
http_response_code(502);
echo json_encode(['error' => 'API bağlantısı kurulamadı.']);
exit;
}
$data = json_decode($raw, true);
if ($status < 200 || $status >= 300) {
error_log('OpenAI request failed: HTTP ' . $status);
http_response_code(502);
echo json_encode(['error' => 'Yanıt geçici olarak alınamadı.']);
exit;
}
$answer = '';
foreach (($data['output'] ?? []) as $item) {
if (($item['type'] ?? '') !== 'message') continue;
foreach (($item['content'] ?? []) as $content) {
if (($content['type'] ?? '') === 'output_text') {
$answer .= (string)($content['text'] ?? '');
}
}
}
if ($answer === '') {
http_response_code(502);
echo json_encode(['error' => 'Boş yanıt alındı.']);
exit;
}
$history[] = ['role' => 'assistant', 'content' => $answer];
$_SESSION['chat_history'] = array_slice($history, -10);
echo json_encode(['answer' => $answer], JSON_UNESCAPED_UNICODE);
3. Basit Chatbot Arayüzü
public/index.html içinde temel bir form ve mesaj alanı oluşturun:
<form id="chat-form">
<label for="message">Mesajınız</label>
<textarea id="message" maxlength="2000" required></textarea>
<button type="submit">Gönder</button>
</form>
<div id="messages" aria-live="polite"></div>
<script>
const form = document.querySelector('#chat-form');
const input = document.querySelector('#message');
const messages = document.querySelector('#messages');
function addMessage(label, text) {
const p = document.createElement('p');
p.textContent = label + ': ' + text;
messages.appendChild(p);
}
form.addEventListener('submit', async (event) => {
event.preventDefault();
const message = input.value.trim();
if (!message) return;
addMessage('Siz', message);
input.value = '';
try {
const response = await fetch('chat.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({message}),
});
const data = await response.json();
if (!response.ok) throw new Error(data.error || 'İstek başarısız');
addMessage('Asistan', data.answer);
} catch (error) {
addMessage('Hata', error.message);
}
});
</script>
Yanıtı innerHTML ile basmak yerine textContent kullanmak, model çıktısının HTML olarak çalıştırılmasını önler.
4. PHP ChatGPT Chatbot Konuşma Geçmişi
Örnekte son 10 mesaj PHP oturumunda tutulur ve her istekte input listesine eklenir. Bu, basit demo için yeterlidir; ancak üretimde oturum boyutunu, eş zamanlı kullanıcıları, silme politikasını ve maliyeti hesaba katın. Gereksiz geçmişi her istekte göndermek token kullanımını artırır.
Responses API ayrıca önceki yanıtlarla çok turlu akışlar için durum yönetimi seçenekleri sunar. Uygulamanızda hangi yöntemi kullanırsanız kullanın, kullanıcıya konuşmaların saklanıp saklanmadığını açıkça bildirin.
5. PHP ChatGPT Chatbot Güvenliği

- API anahtarı: Tarayıcıya, Git deposuna veya hata mesajına yazmayın.
- Oran sınırı: IP ve kullanıcı bazında istek sınırı koyun; yalnızca PHP oturumuna güvenmeyin.
- CSRF ve kimlik doğrulama: Oturum açmış kullanıcıya özel botta CSRF tokenı ve yetki kontrolü ekleyin.
- Girdi sınırı: Mesaj uzunluğu ve dosya türü gibi sınırları sunucu tarafında doğrulayın.
- Günlükler: Ham kişisel veriyi ve API anahtarını loglamayın; istek kimliği ve hata sınıfı yeterli olabilir.
- Çıktı güvenliği: Model yanıtını komut, SQL veya HTML olarak doğrudan çalıştırmayın.
- Maliyet:
max_output_tokens, konuşma geçmişi ve kullanıcı kotası belirleyin.
OpenAI’nin üretim rehberindeki güvenlik, ölçekleme ve maliyet kontrollerini canlıya çıkmadan önce inceleyin.
PHP ChatGPT Chatbot Hataları
401 Unauthorized
Anahtar eksik, yanlış veya ilgili projede yetkisizdir. Değeri tarayıcıda göstermeden sunucu ortam değişkeninin yüklendiğini kontrol edin.
429 Too Many Requests
Oran veya harcama sınırına ulaşılmış olabilir. Yanıttaki hata türünü kaydedin, kullanıcıya bekleme mesajı gösterin ve yalnızca geçici hatalarda sınırlı geri deneme uygulayın.
Model not found
Model adı değişmiş, hesabınızda açık değil veya yanlış yazılmış olabilir. Model kataloğu ile OPENAI_MODEL değerini karşılaştırın.
Boş veya beklenmeyen yanıt
HTTP durumunu ve yanıt yapısını kontrol edin. Ham API yanıtını kullanıcıya göstermeyin; hassas veri içermeyecek biçimde sunucu günlüklerinde hata sınıfını saklayın.
Sık Sorulan Sorular
ChatGPT Plus aboneliği API kullanımını karşılar mı?
ChatGPT aboneliği ile API platformu ayrı ürünlerdir. API erişimi ve faturalandırmasını OpenAI Platform hesabınızdan kontrol edin.
Veritabanı gerekli mi?
Basit oturum tabanlı demo için gerekli değildir. Kalıcı konuşma geçmişi, kullanıcı hesabı veya denetim kaydı istiyorsanız erişim kontrollü bir veri katmanı gerekir.
Bu örnek canlı sitede kullanılabilir mi?
Doğrudan değil. Canlı ortam için kimlik doğrulama, CSRF koruması, dağıtık oran sınırı, hata izleme, gizlilik metni, kullanım kotası ve kapsamınıza uygun güvenlik testleri ekleyin.
Sonuç
PHP ChatGPT chatbot yapımında temel prensip; tarayıcıyı doğrudan OpenAI’ye bağlamamak, girdiyi PHP’de doğrulamak, Responses API çağrısını sunucuda yapmak ve yanıtı güvenli metin olarak göstermektir. Küçük örnek çalıştıktan sonra oran sınırı, maliyet, gizlilik ve hata yönetimini tamamlamadan uygulamayı halka açmayın.




