Gereksinimler ve Ön Hazırlık
Projemizi geliştirmek için PHP 8.2 veya üzeri bir sürüme, veritabanı yönetimi için MySQL veya MariaDB'ye ve temel düzeyde bir web sunucusuna (Apache veya Nginx) ihtiyacınız olacak. Ayrıca, istemci tarafında (tarayıcı) dinamik içerik güncellemeleri için JavaScript'in Fetch API özelliğinden faydalanacağız.
- PHP 8.2+ (Modern sözdizimi ve güvenlik iyileştirmeleri için zorunludur).
- MySQL 8.0+ (Veri depolama için).
- PDO (PHP Data Objects) eklentisi (Güvenli veritabanı işlemleri için).
- Temel JavaScript (Asenkron işlemler için).
Veritabanı Yapısının Tasarlanması
Canlı destek sisteminin kalbi, mesajların tutulduğu veritabanıdır. Mesajlaşma verimliliği için ilişkisel bir tablo yapısı kurmalıyız. Aşağıdaki SQL komutu, hem ziyaretçi hem de admin mesajlarını tek bir tabloda tutmamızı sağlar.
CREATE TABLE destek_mesajlari (
id INT AUTO_INCREMENT PRIMARY KEY,
oturum_id VARCHAR(255) NOT NULL,
gonderen ENUM('ziyaretci', 'admin') NOT NULL,
mesaj TEXT NOT NULL,
okundu_mu TINYINT(1) DEFAULT 0,
tarih TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Bu tablo yapısında oturum_id, ziyaretçinin tarayıcı çerezleri veya benzersiz bir ID ile takip edilmesini sağlar. gonderen sütunu ise mesajın kimden geldiğini ayırt etmemize olanak tanır.
PHP ile Veritabanı Bağlantısı ve Güvenlik
Veritabanı bağlantılarında her zaman PDO kullanmalıyız. PDO, SQL Injection saldırılarına karşı hazırlıklı ifadeler (prepared statements) sunarak verilerinizi korur. Aşağıdaki kod bloğu, veritabanı bağlantısını güvenli bir şekilde kurar.
utf8mb4 karakter seti, emoji ve özel karakterlerin sorunsuz saklanması için 2026 standartlarında bir zorunluluktur.
Mesaj Gönderme ve Kaydetme İşlemi
Kullanıcının yazdığı mesajı veritabanına kaydetmek için bir PHP endpoint (uç nokta) oluşturmalıyız. Bu dosya, POST isteği ile gelen veriyi temizleyerek veritabanına yazar.
Asenkron Mesaj Çekme: AJAX ve Fetch API Entegrasyonu
Canlı destek modülünün gerçek zamanlı hissettirmesi için sayfa yenilenmeden mesajların veritabanından çekilmesi gerekir. Bunun için JavaScript tarafında fetch API kullanarak, belirli aralıklarla (örneğin her 3 saniyede bir) PHP uç noktamıza istek gönderen bir yapı kurmalıyız.
Aşağıdaki JavaScript kodu, veritabanındaki yeni mesajları listeleyen get_messages.php dosyasını sorgular ve gelen JSON verisini HTML içerisine işler:
function fetchMessages() {
fetch('get_messages.php?session_id=' + currentSessionId)
.then(response => response.json())
.then(data => {
const chatBox = document.getElementById('chat-box');
chatBox.innerHTML = '';
data.forEach(msg => {
chatBox.innerHTML += `${msg.mesaj}`;
});
})
.catch(error => console.error('Hata:', error));
}
// Her 3 saniyede bir mesajları güncelle
setInterval(fetchMessages, 3000);
Sunucu tarafında ise get_messages.php dosyanızın, belirtilen session_id değerine ait mesajları ORDER BY id ASC şeklinde çekip json_encode() ile döndürmesi yeterlidir.
Performans ve Ölçeklenebilirlik İpuçları
Canlı destek sistemleri, eşzamanlı çok sayıda kullanıcı olduğunda veritabanı üzerinde yoğun bir yük oluşturabilir. Performansı optimize etmek için şu stratejileri izlemelisiniz:
- İndeksleme:
messages tablosunda oturum_id sütununa mutlaka bir INDEX ekleyin. Bu, sorgu süresini milisaniyeler seviyesine indirir.
- Sorgu Kısıtlama: Tüm mesaj geçmişini çekmek yerine, sadece son 50 mesajı veya en son çekilen mesaj ID'sinden sonraki verileri getiren bir mantık kurun.
- Long Polling veya WebSocket: Eğer sisteminiz çok yüksek trafik alıyorsa,
setInterval kullanmak yerine Ratchet gibi PHP kütüphaneleri ile WebSocket teknolojisine geçiş yapmayı değerlendirin.
Veritabanı sorgunuzu optimize etmek için şu SQL yapısını kullanabilirsiniz:
-- İndeks ekleme komutu
ALTER TABLE mesajlar ADD INDEX(oturum_id);
-- Sadece yeni mesajları çeken optimize sorgu
SELECT * FROM mesajlar
WHERE oturum_id = :session_id
AND id > :last_id
ORDER BY id ASC LIMIT 50;
Bu yöntemle, veritabanı her seferinde tüm tabloyu taramak yerine, sadece ilgili oturuma ait ve henüz gösterilmemiş mesajları getirerek sunucu yükünü minimize eder.


Yorumlar (0)
Yorum Yaz