Gereksinimler ve Ön Hazırlık
Uygulamayı geliştirmeye başlamadan önce sisteminizde aşağıdaki araçların yüklü ve yapılandırılmış olduğundan emin olmalısınız. Laravel 11 ve üzeri sürümlerde yerleşik olarak gelen Reverb, geleneksel Websocket sunucularına göre çok daha yüksek performans sunar.
- PHP 8.3 veya üzeri bir sürüm.
- Composer paket yöneticisi.
- Node.js ve NPM (Frontend varlıklarını derlemek için).
- Redis (Opsiyonel ancak yüksek trafikli uygulamalar için önerilir).
- Laravel 11+ kurulu temiz bir proje.
Kurulumu başlatmak için terminalinizde şu komutu çalıştırarak gerekli paketleri projenize dahil edin:
composer require laravel/reverb
Bu komut, Laravel'in kendi Websocket sunucusunu projenize entegre eder. Ardından kurulumu tamamlamak için şu komutu kullanın:
php artisan install:broadcasting
Laravel Reverb ile Websocket Sunucusunu Yapılandırma
Reverb, Laravel ekosistemiyle tam entegre çalışan bir Websocket sunucusudur. Yapılandırma dosyaları config/reverb.php altında yer alır. Sunucuyu yerel ortamda çalıştırmak için gerekli olan çevresel değişkenleri .env dosyanızda şu şekilde düzenlemelisiniz:
REVERB_SERVER_HOST=0.0.0.0
REVERB_SERVER_PORT=8080
REVERB_SCHEME=http
BROADCAST_CONNECTION=reverb
Sunucuyu başlatmak için php artisan reverb:start komutunu kullanabilirsiniz. Bu komut, uygulamanızın Websocket trafiğini dinlemeye başlayacaktır.
Sohbet Mesajları İçin Event (Olay) Oluşturma
Laravel'de gerçek zamanlı veri iletimi "Event" (Olay) yapısı üzerinden gerçekleşir. Bir kullanıcı mesaj gönderdiğinde, bu mesajın ilgili kanallara yayınlanması gerekir. Bunun için app/Events/MessageSent.php dosyasını oluşturmalıyız.
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class MessageSent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public function __construct(public $message, public $user) {}
public function broadcastOn(): Channel
{
return new Channel('chat-room');
}
}
Bu sınıf, ShouldBroadcast arayüzünü uygulayarak mesajın otomatik olarak Websocket üzerinden yayınlanmasını sağlar. broadcastOn metodu, mesajın hangi kanala (room) gönderileceğini belirler.
Frontend Tarafında Laravel Echo Kullanımı
İstemci (tarayıcı) tarafında Websocket sunucusuna bağlanmak ve gelen mesajları dinlemek için "Laravel Echo" kullanılır. Öncelikle gerekli kütüphaneleri yükleyin:
npm install --save-dev laravel-echo pusher-js
Ardından resources/js/bootstrap.js dosyasında Echo yapılandırmasını şu şekilde güncelleyin:
import Echo from 'laravel-echo';
import Pusher from 'pusher-js';
window.Pusher = Pusher;
window.Echo = new Echo({
broadcaster: 'reverb',
key: import.meta.env.VITE_REVERB_APP_KEY,
wsHost: import.meta.env.VITE_REVERB_HOST,
wsPort: import.meta.env.VITE_REVERB_PORT ?? 80,
forceTLS: false,
enabledTransports: ['ws', 'wss'],
});
Bu yapılandırma, tarayıcının Reverb sunucusuyla iletişim kurmasını sağlar. wsHost ve wsPort değerlerinin .env dosyanızla eşleştiğinden emin olun.
Mesajları Anlık Olarak Dinleme ve Görüntüleme
Artık sunucudan gelen verileri tarayıcıda yakalayabiliriz. Bir JavaScript bileşeni içerisinde, oluşturduğumuz kanala abone olup gelen veriyi ekrana yazdıralım:
window.Echo.channel('chat-room')
.listen('MessageSent', (e) => {
console.log('Yeni mesaj alındı:', e.message);
// Mesajı DOM'a ekleme mantığı buraya gelecek
appendMessageToChat(e.user.name, e.message);
});
Bu kod bloğu, chat-room kanalındaki MessageSent olayını dinler. Olay tetiklendiğinde, gelen mesaj ve gönderen kullanıcı bilgisiyle arayüzü günceller.
Güvenlik ve Performans Karşılaştırması
Websocket uygulamalarında güvenlik, özellikle yetkilendirme (authorization) konusunda kritik öneme sahiptir. Özel kanallar kullanıyorsanız, kullanıcıların o kanala erişim yetkisi olup olmadığını routes/channels.php üzerinden kontrol etmelisiniz.
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Reverb (Yerel) | Düşük gecikme, Laravel entegrasyonu | Sunucu kaynaklarını tüketir |
| Pusher (Bulut) | Bakım gerektirmez, ölçeklenebilir | Maliyetli olabilir |
| Soketi.io | Çok geniş ekosistem | Laravel ile kurulumu daha karmaşıktır |
Kritik Güvenlik Uyarısı: Websocket üzerinden gönderilen verilerde XSS (Cross-Site Scripting) saldırılarına karşı mutlaka veri temizleme (sanitization) işlemi yapın. İstemciden gelen veriyi asla doğrudan HTML olarak sayfaya basmayın; her zaman veriyi escape ederek işleyin.
Sıkça Sorulan Sorular
Websocket sunucusu üretim ortamında (production) nasıl çalıştırılmalı?
Üretim ortamında Reverb sunucusunu supervisor gibi bir süreç yöneticisi kullanarak arka planda sürekli çalışır durumda tutmalısınız. Bu, sunucu yeniden başlatıldığında Websocket servisinin otomatik ayağa kalkmasını sağlar.
Özel kanallar (Private Channels) nasıl korunur?
routes/channels.php içerisinde Broadcast::channel tanımlayarak, kullanıcının o odaya girmeye yetkisi olup olmadığını kontrol eden bir closure (anonim fonksiyon) yazmalısınız.
Mesajlar neden anlık gitmiyor?
Genellikle bu durum QUEUE_CONNECTION ayarının sync olarak kalmasından kaynaklanır. Gerçek zamanlı işlemler için bir kuyruk sürücüsü (Redis veya Database) kullanmalı ve php artisan queue:work komutunu çalıştırmalısınız.
SSL/HTTPS ile Websocket nasıl kullanılır?
Üretim ortamında wss:// protokolünü kullanmanız gerekir. Bunun için Reverb yapılandırmasında SSL sertifika yollarını belirtmeli veya bir ters vekil sunucu (Nginx/Apache) üzerinden SSL sonlandırması yapmalısınız.
Birden fazla sunucuda nasıl ölçeklenir?
Reverb, Redis Pub/Sub desteği sayesinde çoklu sunucu mimarilerinde kolayca ölçeklenebilir. Redis'i ana mesajlaşma kanalı olarak yapılandırmanız yeterlidir.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Uygulamanızı yayına almadan önce SQL injection, XSS ve yetkilendirme açıklarına karşı kapsamlı bir güvenlik testinden geçirdiğinizden emin olun. Yazılım güvenliği, sürekli güncellenen bir süreçtir.
Websocket Uygulamalarında Hata Ayıklama ve İzleme Stratejileri
Gerçek zamanlı uygulamalarda en büyük zorluk, bağlantı koptuğunda veya olaylar tetiklenmediğinde sorunun kaynağını bulmaktır. Laravel Reverb ve Echo ikilisini kullanırken, sistemin sağlıklı çalışıp çalışmadığını anlamak için izleyebileceğiniz profesyonel yöntemler bulunmaktadır.
Reverb Debug Modu ve Loglama
Geliştirme aşamasında, WebSocket sunucusunun arka planda neler yaptığını görmek için --debug bayrağını kullanmak kritik öneme sahiptir. Bu komut, gelen bağlantıları, kanal aboneliklerini ve yayınlanan olayları terminal ekranına anlık olarak döker.
php artisan reverb:start --debug
Eğer üretim ortamında (production) bir sorun yaşıyorsanız, config/reverb.php dosyasındaki loglama ayarlarını yapılandırarak, hataları Laravel'in standart storage/logs/laravel.log dosyasına yönlendirebilirsiniz. Ayrıca, bağlantı hatalarını izlemek için tarayıcı konsolunda Echo'nun hata yakalama mekanizmasını şu şekilde özelleştirebilirsiniz:
window.Echo.connector.pusher.connection.bind('error', (err) => {
console.error('WebSocket Bağlantı Hatası:', err);
});
window.Echo.connector.pusher.connection.bind('disconnected', () => {
console.warn('WebSocket bağlantısı kesildi, yeniden bağlanılıyor...');
});
Performans Optimizasyonu ve İleri İpuçları
Sohbet uygulamanız büyüdükçe, WebSocket sunucunuz üzerindeki yük artacaktır. Performansı optimize etmek için sadece teknik altyapıyı değil, veri akışını da optimize etmeniz gerekir. İşte ölçeklenebilir bir yapı için dikkat etmeniz gerekenler:
- Yük Dengeleme (Load Balancing): Birden fazla Reverb düğümü kullanıyorsanız, Redis'in mesajları düğümler arasında düzgün dağıttığından emin olun.
- Payload Boyutu: WebSocket üzerinden gönderdiğiniz JSON verilerini minimum boyutta tutun. Büyük veri bloklarını göndermek yerine, sadece gerekli ID ve içerik bilgisini iletin.
- Bağlantı Zaman Aşımı: Sunucu kaynaklarını korumak için boşta kalan (idle) bağlantıları belirli bir süre sonra sonlandıracak yapılandırmaları
config/reverb.phpüzerinden yönetin.
Veri Akışını Yönetmek İçin Örnek Senaryo: "Yazıyor..." Göstergesi
Kullanıcı deneyimini artırmak için "X kişisi yazıyor..." özelliğini eklemek oldukça popülerdir. Bu, mesajın kendisinden farklı olarak çok daha sık tetiklenen bir olaydır. Bu tür "yüksek frekanslı" olayları yönetirken throttle (kısıtlama) mekanizması kullanmak sunucu yükünü ciddi oranda azaltır.
// Frontend: Kullanıcı yazı yazmaya başladığında
Echo.private('chat.1')
.whisper('typing', {
name: 'Kullanıcı Adı'
});
// Frontend: Dinleme tarafı
Echo.private('chat.1')
.listenForWhisper('typing', (e) => {
console.log(e.name + ' yazıyor...');
});
whisper yöntemi, sunucuyu (Reverb) yormadan doğrudan istemciler arasında veri iletimi sağlar. Bu yöntem, veritabanına kayıt gerektirmeyen anlık durum bildirimleri için en performanslı çözümdür.
Sonuç
Laravel ve Reverb kullanarak gerçek zamanlı bir sohbet uygulaması geliştirmek, modern web mimarisinin temel taşlarından biridir. Bu rehberde Websocket sunucusunun kurulumundan, olayların yayınlanmasına ve istemci tarafında dinlenmesine kadar olan süreci adım adım inceledik. Bir sonraki adım olarak, mesaj geçmişini veritabanında saklayıp, kullanıcı sayfayı yenilediğinde eski mesajları yükleyen bir "Mesaj Geçmişi" özelliği eklemeyi deneyebilirsiniz.


Yorumlar (0)
Yorum Yaz