Web uygulamaları genellikle basit bir model üzerine kuruludur: tarayıcı bir istek gönderir, sunucu bunu işler, sunucu bir yanıt gönderir ve bağlantı kapanır. Bu istek-yanıt döngüsü, on yıllardır web’i beslemekte ve çoğu etkileşim için kusursuz bir şekilde çalışmaktadır. Ancak bazen yetersiz kalır.
Örneğin, bir proje yönetim uygulamasını düşünün; birçok ekip üyesi aynı görev tahtasını izliyor. Alice, bir görevi “Devam Ediyor”dan “Tamamlandı”ya taşır. Bob, aynı tahtayı izlerken, değişikliği görmeden sayfayı yenilemek zorunda kalıyor. Geleneksel bir HTTP uygulamasında, Bob’un tarayıcısının sunucuda bir şeylerin değiştiğini bilmesinin bir yolu yoktur. Sürekli olarak sunucuya “bir şey değişti mi?” diye sorması gerekecektir, bu da gereksiz bir kaynak israfına yol açar ve gecikme getirir.
WebSocket’ler bu problemi zarif bir şekilde çözer. Her istek-yanıt döngüsünden sonra bağlantıyı kapatmak yerine, bir WebSocket bağlantısı açık kalır. Sunucu, bir şey olduğunda tarayıcıya anında veri iletebilir; tarayıcının talep etmesi gerekmez. Alice görevi taşıdığında, sunucu değişikliği yayar ve Bob’un tarayıcısı gerçek zamanlı olarak güncellenir.
Bu kılavuz, sıfır WebSocket bilgisi ile başlayarak Laravel uygulamanıza çalışan bir gerçek zamanlı özellik eklemenize yardımcı olacaktır.
WebSocket’lerin Çalışma Prensibi
WebSocket’lerin Çalışma Prensibi
Bir WebSocket bağlantısı, normal bir HTTP isteği ile başlar. Tarayıcı, “WebSocket protokolüne geçmek istiyorum” diyen özel bir Upgrade başlığı ile bir HTTP isteği gönderir. Sunucu WebSocket’leri destekliyorsa, 101 durum kodu (Protokol Değişikliği) ile yanıt verir ve bağlantı HTTP’den WebSocket’e geçer.
Bağlantı yükseltildikten sonra, tam-duplex bir iletişim kanalı haline gelir. Hem tarayıcı hem de sunucu her zaman bağımsız olarak mesaj gönderebilirler. Bağlantı, herhangi bir tarafın açıkça kapatması veya bir ağ kesintisi gerçekleşmesi durumunda kapanır.
Normal HTTP’den temel farkları:
- Kalıcı: Bağlantı oturum süresi boyunca açık kalır. Her mesaj için tekrar tekrar el sıkışma yok, her mesaj için bağlantı yükü yok.
- Çift yönlü: Sunucu, istemcinin talep etmeden veri gönderebilir. İstemci de herhangi bir zamanda sunucuya veri gönderebilir.
- Düşük gecikme: Mesajlar, her mesaj için bağlantı kurulumu olmadığından milisaniyeler içinde iletilir.
- Düşük yük: WebSocket çerçeveleri, HTTP isteklerine kıyasla minimum başlık içerdiğinden, mesaj başına yük oldukça küçüktür.
WebSocket’ler, canlı bildirimler, gerçek zamanlı panolar, sohbet uygulamaları, birlikte düzenleme, canlı etkinlik güncellemeleri gibi, kullanıcıların değişiklikleri anında görmesi gereken durumlar için idealdir.
Laravel Broadcasting: Çerçeve Katmanı
Laravel Broadcasting: Çerçeve Katmanı
Laravel, size ham WebSocket bağlantıları ile çalışmanızı istemez. Bunun yerine, karmaşıklığı temiz, olay odaklı bir API’ye dönüştüren bir Broadcasting sistemi sunar. Olayları PHP’de tanımlarsınız, yayınlarsınız ve JavaScript’te dinlersiniz. Laravel işin altyapısını halleder.
Broadcasting sistemi üç bileşenden oluşur:
Olaylar: ShouldBroadcast veya ShouldBroadcastNow arayüzlerini uygulayan standart Laravel olayları. Bu olaylar gönderildiğinde, Laravel kamuya açık özelliklerini seri hale getirir ve bunları broadcasting sürücüsüne gönderir.
Kanal: Yayınları organize eden adlandırılmış kanallar. Laravel, üç türünü destekler:
- Herkesin dinleyebileceği genel kanallar.
- Kimlik doğrulaması gerektiren özel kanallar. Sunucu, bir kullanıcının kanala dinleyici olarak bağlanmaktan yetkili olup olmadığını doğrular.
- Özel kanallara ek olarak dinleyicilerin kimler olduğunu görmeyi sağlar. Bu, “kim çevrimiçi” göstergeleri için idealdir.
Laravel Echo: WebSocket sunucusuna bağlanan ve kanallara abone olmak ve olayları dinlemek için temiz bir API sağlayan bir JavaScript kütüphanesi.
Reverb ve Üçüncü Parti Hizmetler
Reverb ve Üçüncü Parti Hizmetler
Reverb’den önce, Laravel geliştiricilerinin WebSocket altyapısı için iki ana seçeneği vardı: Pusher (ücretli, barındırılan bir hizmet) ve laravel-websockets (Laravel uygulamanızla birlikte çalışan bir WebSocket sunucusu). Her birinin artıları ve eksileri bulunmaktadır.
Pusher, hızlı kurulum için kolaydır ancak bir üçüncü taraf bağımlılığı, sürekli maliyetler ve mesajların dış bir hizmet aracılığıyla yönlendirilmesi nedeniyle gecikmeler getirir. Laravel-websockets paketi her şeyi dahili olarak tutar ancak bir topluluk projesidir, bakımı değişken olabilir ve üretimde güvenilir bir şekilde çalışmak zor olabilir.
Laravel Reverb durumu değiştirdi. Reverb, Laravel ekibi tarafından özellikle Laravel Broadcasting için tasarlanmış yüksek performanslı bir WebSocket sunucusu sağlayan birinci parti bir Laravel paketidir. Kendi sunucularınızda çalışır, böylece hiçbir üçüncü taraf bağımlılığı, mesaj başına maliyet yok ve dış bir hizmet aracılığıyla yönlendirmeden kaynaklanan ek gecikme yoktur.
Reverb, ReactPHP üzerine inşa edilmiştir ve binlerce eşzamanlı bağlantıyı etkili bir şekilde yönetir. Özel ve varlık kanalları için Laravel’in kimlik doğrulama sistemine tam entegrasyon sağlar ve Laravel Echo ile kutudan çıktığı gibi çalışır.
Birçok Laravel uygulaması için, Deploynix’te dağıtım yaparken Reverb açık bir seçimdir. WebSocket altyapınızı tam kontrol altında bulursunuz, dış bağımlılıklarınız olmaz ve Laravel ekibinden birinci parti destek alırsınız.
Laravel Uygulamanızda Reverb Kurulumu
Laravel Uygulamanızda Reverb Kurulumu
Mevcut bir Laravel uygulamasına Reverb eklemeye geçelim.
Adım 1: Reverb’i Kurun
Adım 1: Reverb’i Kurun
Reverb’i Artisan yükleyicisi ile kurun:
php artisan install:broadcasting
Bu komut Reverb paketini kurar, yapılandırma dosyasını yayarlar, .env dosyanıza gerekli ortam değişkenlerini ekler ve JavaScript bağımlılıklarını (Laravel Echo ve Echo’nun WebSocket istemci kütüphanesi olarak kullandığı Pusher JS istemcisi) yükler.
Adım 2: Ortam Değişkenlerini Yapılandırın
Adım 2: Ortam Değişkenlerini Yapılandırın
Kurulumdan sonra, .env dosyanızda yeni Reverb ile ilgili değişkenler olacaktır:
BROADCAST_CONNECTION=reverb
REVERB_APP_ID=your-app-id
REVERB_APP_KEY=your-app-key
REVERB_APP_SECRET=your-app-secret
REVERB_HOST="localhost"
REVERB_PORT=8080
REVERB_SCHEME=https
Geliştirme aşamasında, localhost uygun olacaktır. Üretimde Deploynix’te bunları farklı yapılandırmanız gerekecek (bunu dağıtım bölümünde ele alacağız).
Adım 3: Yayınlanabilir Bir Olay Oluşturun
Adım 3: Yayınlanabilir Bir Olay Oluşturun
ShouldBroadcastNow uygulayan bir olay oluşturun:
php artisan make:event NewMessage --broadcast
Bu işlem, belirtilen kuyruğu kullanarak bir olay oluşturacak ve bu olayı dinleyen istemcilerin anında güncellenmesini sağlar. Bu kılavuzda ele alınan tüm detayları kullanarak, Laravel uygulamanızda WebSocket tabanlı, gerçek zamanlı uygulamalar oluşturmak için gerekli adımları tamamlamış olacaksınız.
Kaynak: Orijinal Makale


