Geliştirmeden Önce Okunması Gerekenler
Workerman kullanarak uygulama geliştirirken, aşağıdaki konuları anlamanız gerekmektedir:
1. Workerman Geliştirme ile Normal PHP Geliştirme Arasındaki Farklar
HTTP protokolüne yönelik değişken işlevlerin doğrudan kullanılamaması dışında, Workerman geliştirme ile normal PHP geliştirme arasında büyük bir fark yoktur.
1. Uygulama Katmanı Protokollerinin Farklılığı
- Normal PHP geliştirme genellikle HTTP uygulama katmanı protokolüne dayanır; WebSunucu, geliştiricilere protokol çözümlemesini sağlamıştır.
-
Workerman, HTTP, WebSocket gibi farklı protokolleri desteklemekte ve geliştiricilerin daha basit özel protokollerle iletişim kurmasını önermektedir.
- HTTP protokolü geliştirmek için Http hizmeti bölümüne başvurunuz.
2. İstek Döngüsü Farklılıkları
- PHP web uygulamalarında bir istek tamamlandığında, tüm değişkenler ve kaynaklar serbest bırakılır.
- Workerman ile geliştirilen uygulamalar, ilk yükleme sonrası bellekte sürekli olarak saklandığı için, sınıf tanımlamaları, genel nesneler ve sınıfın statik üyeleri serbest bırakılmaz ve bu sayede sonraki kullanımlar için tekrar kullanılabilir.
3. Sınıf ve Sabit Tanımlarının Tekrarından Kaçınmaya Dikkat Edin
- Workerman, derlenmiş PHP dosyalarını önbelleğe aldığından, aynı sınıf veya sabit tanım dosyasını birden fazla kez require/include etmekten kaçınılmalıdır. Dosyaları require_once/include_once ile yüklemeniz önerilmektedir.
4. Singleton Modellerinin Bağlantı Kaynaklarının Serbest Bırakılmasına Dikkat Edin
- Workerman, her istek sonrası genel nesneleri ve sınıfın statik üyelerini serbest bırakmadığı için, veritabanı gibi singleton modellerinde, genellikle veritabanı örneği (içerisinde bir veritabanı socket bağlantısı barındırır) veritabanının statik üyesinde saklanır. Bu durum, Workerman'ın işlem yaşam döngüsü boyunca bu veritabanı socket bağlantısını yeniden kullanmasını sağlar. Dikkat edilmesi gereken, veritabanı sunucusunun eğer bir bağlantıda belirli bir süre boyunca bir aktivite bulamazsa socket bağlantısını kapatabilmesidir; bu durumda bu veritabanı örneğini yeniden kullanmaya çalıştığınızda hata alırsınız (hata mesajı mysql gone away benzeri olur). Workerman, yeniden bağlantı kurma işlevine sahip veritabanı sınıfını sağlar, geliştiriciler bunu doğrudan kullanabilirler.
5. exit veya die Kullanımından Kaçının
- Workerman, PHP komut satırı modunda çalıştığı için, exit veya die komutları çağrıldığında mevcut işlem çıkış yapar. Alt prosesler çıkış yaptıktan sonra hemen aynı alt proseslerin yeniden oluşturulması devam etse de, bu durum iş süreçlerine etki edebilir.
6. Kod Değişikliklerinden Sonra Servisi Yeniden Başlatmanız Gerekmektedir
Workerman bellekte sürekli olarak çalıştığı için, php sınıfı ve işlevlerin tanımları bir kez yüklendikten sonra bellekte kalır; bu nedenle, her iş kodunu değiştirdikten sonra yenilemek için servisi yeniden başlatmanız gerekmektedir.
2. Anlaşılması Gereken Temel Kavramlar
1. TCP Taşıma Katmanı Protokolü
TCP, bağlantı odaklı, güvenilir, IP tabanlı bir taşıma katmanı protokolüdür. TCP'nin önemli bir özelliği, veri akışı temelinde çalışmasıdır; istemcinin talepleri sürekli olarak sunucuya gönderilir, sunucunun aldığı veriler bir bütün istek olmayabileceği gibi, birden fazla isteğin bir araya gelmesi de mümkün olabilir. Bu durumda, sürekli akan bu veri akışında her isteğin sınırını ayırmamız gerekmektedir. Uygulama katmanı protokolleri, taleplerin sınırlarını tanımlamak için bir dizi kural oluşturur ve veri karmaşasını önler.
2. Uygulama Katmanı Protokolü
Uygulama katmanı protokolü (application layer protocol), farklı uç sistemlerde (istemci, sunucu) çalışan uygulama süreçlerinin nasıl mesaj alışverişi yapacağını tanımlar; örneğin, HTTP ve WebSocket uygulama katmanı protokolleridir. Örneğin basit bir uygulama katmanı protokolü aşağıdaki gibi olabilir {"module":"user","action":"getInfo","uid":456}\n" Bu protokol, "\n" (buradaki "\n" karakteri bir yeni satırı temsil etmektedir) ile isteğin sona erdiğini belirtmektedir; mesaj gövdesi bir stringdir.
3. Kısa Bağlantı
Kısa bağlantı, iki taraf arasında veri alışverişi olduğunda bir bağlantı kurulması ve veri gönderimi tamamlandığında bu bağlantının kapatılması anlamına gelir; yani her bağlantı yalnızca bir iş işlemini tamamlar. WEB sitesi HTTP hizmetleri genellikle kısa bağlantı kullanmaktadır.
Kısa bağlantı uygulama geliştirme, temel geliştirme süreci bölümüne başvurabilirsiniz.
4. Uzun Bağlantı
Uzun bağlantı, bir bağlantı üzerinden sürekli olarak birden fazla veri paketi gönderilebilmesi anlamına gelir.
Dikkat: Uzun bağlantı uygulamaları kalp atışı eklemelidir, aksi takdirde bağlantı uzun süre etkin olmadığında yönlendirme düğümü güvenlik duvarı tarafından kapatılabilir.
Uzun bağlantılar genellikle yoğun işlemler ve nokta üzeri iletişim durumları için kullanılır. Her TCP bağlantısının üç aşamalı bir el sıkışma süreci vardır ve bu süre alır; eğer her işlem öncelikle bağlantı kurarak başlayacaksa, işlem hızı önemli ölçüde düşecektir. Bu nedenle, uzun bağlantılar her işlemden sonra kapatılmadan devam eder ve bir sonraki işlemde doğrudan veri paketi gönderilir; yani yeni bir TCP bağlantısı kurmaya gerek kalmaz. Örneğin, veritabanı bağlantısı uzun bağlantı kullanır; kısa bağlantı kullanılmak istenildiğinde sık iletişim, socket hatalarına neden olabilir ve sık sık socket oluşturmak kaynak israfına yol açar.
Aktif olarak istemciye veri göndermek gerektiğinde, sohbet, anlık oyun gibi uygulamalar uzun bağlantılar gerektirir.
Uzun bağlantı uygulama geliştirme için Gateway/Worker geliştirme sürecine başvurabilirsiniz.
5. Sorunsuz Yeniden Başlatma
Genel olarak yeniden başlatma işlemi, tüm süreçlerin tamamen durdurulup ardından yeni servis süreçlerinin oluşturulmasını içerir. Bu süreçte, bir süre için dışa hizmet veren hiçbir süreç olmayacaktır; bu da hizmetin geçici olarak kullanılamaz durumda olmasına yol açacak ve yüksek eşzamanlılık durumunda isteklerin başarısız olmasına neden olacaktır.
Sorunsuz yeniden başlatma, tüm süreçleri bir seferde durdurmak yerine, bir süreç durdurup hemen onun yerini alacak yeni bir süreç oluşturma şeklinde gerçekleştirilmektedir. Eski süreçlerin tamamı değiştirilene kadar bu işlem devam eder.
Sorunsuz yeniden başlatma, Workerman ile php your_file.php reload komutu kullanılarak yapılabilir ve uygulamanın güncellenmesini hizmet kalitesini etkilemeden sağlar.
Dikkat: yalnızca on{...} geri çağrısı içinde yüklenen dosyalar, sorunsuz yeniden başlatma sonrasında otomatik olarak güncellenir; başlatma betiğinde doğrudan yüklenen dosyalar veya sabit kodlar çalıştırıldığında yeniden yüklenmeyecektir.
3. Ana Süreç ile Alt Süreç Arasındaki Fark
Kodun ana süreçte mi yoksa alt süreçte mi çalıştığına dikkat etmek gerekir. Genel olarak, Worker::runAll(); çağrısından önceki kodlar ana süreçte çalışırken, onXXX geri çağrısı ile çalışan kodlar alt süreçlere aittir. Worker::runAll(); sonrası yazılan kodlar asla çalıştırılmaz.
Aşağıdaki kod örneği:
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// Ana süreçte çalışıyor
$tcp_worker = new Worker("tcp://0.0.0.0:2347");
// Atama işlemi ana süreçte çalışıyor
$tcp_worker->onMessage = function(TcpConnection $connection, $data)
{
// Bu bölüm alt süreçte çalışıyor
$connection->send('hello ' . $data);
};
Worker::runAll();
Dikkat: Ana süreçte veritabanı, memcache, redis gibi bağlantı kaynaklarını başlatmayın; çünkü ana süreçte başlatılan bağlantılar alt süreçler tarafından otomatik olarak miras alınabilir (özellikle singleton kullanıldığında), bu nedenle tüm süreçler aynı bağlantıyı taşır ve sunucu üzerinden gönderilen veriler birden fazla süreçte okunabilir hale gelir, bu da veri karışıklığına yol açar. Aynı şekilde, herhangi bir süreç bağlantıyı kapatırsa (örneğin daemon modunda çalışırken ana süreç çıkış yapar ve bağlantıyı kapatırsa) tüm alt süreçlerin bağlantıları da birlikte kapanır ve tahmin edilemeyen hatalarla sonuçlanır; örneğin mysql gone away hatası.
Bağlantı kaynaklarını onWorkerStart içinde başlatmanız önerilir.