Yumuşak Yeniden Başlatmanın Prensibi
Yumuşak Yeniden Başlatma Nedir?
Yumuşak yeniden başlatma, sıradan bir yeniden başlatmadan farklıdır; yumuşak yeniden başlatma, hizmeti etkilemeden yeniden başlatmayı mümkün kılar (genellikle kısa bağlantı işlerini ifade eder), böylece PHP programını yeniden yükleyebilir ve iş kodu güncellemelerini tamamlayabilir.
Yumuşak yeniden başlatma genellikle iş güncellemeleri veya sürüm dağıtımı sürecinde kullanılır; böylece kod dağıtımından kaynaklanan geçici hizmet kesintilerinin etkisini önleyebilir.
Dikkat
Windows sistemlerireloadözelliğini desteklemez.Dikkat
Uzun bağlantı (örneğin websocket) işleri, süreç yumuşak yeniden başlatıldığında bağlantılar kesilecektir. Çözüm, gatewayWorker gibi bir mimari kullanmaktır; bir grup süreç bağlantıları sürdürmek için özel olarak tasarlanmıştır ve bu grup süreçlerin reloadable özelliği false olarak ayarlanmalıdır. İş mantığı başka bir grup işçi süreci başlatarak işlenir, gateway ile işçi süreçleri tcp iletişimi ile birbirlerini çağırır. İş gereksinimi değiştiğinde, yalnızca işçi süreçlerini yeniden başlatmak gerekir.
Kısıtlamalar
Dikkat: Sadece on{...} geri çağırmasında yüklenen dosyalar yumuşak yeniden başlatma sonrasında otomatik olarak güncellenecektir; başlatma betiğinde doğrudan yüklenen dosyalar veya yazılmış kodlar reload çalıştırıldığında otomatik güncellenmez.
Aşağıdaki kod reload sonrasında güncellenmeyecek
$worker = new Worker('http://0.0.0.0:1234');
$worker->onMessage = function($connection, $request) {
$connection->send('hi'); // Yazılmış kod sıcak güncellemeyi desteklemez
};
$worker = new Worker('http://0.0.0.0:1234');
require_once __DIR__ . '/your/path/MessageHandler.php'; // Başlatma betiği doğrudan yüklenen dosyalar sıcak güncellemeyi desteklemez
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage']; // MessageHandler sınıfında onMessage metodu olduğunu varsayıyoruz
Aşağıdaki kod reload sonrasında otomatik olarak güncellenecek
$worker = new Worker('http://0.0.0.0:1234');
$worker->onWorkerStart = function($worker) { // onWorkerStart, süreç başlatıldıktan sonra tetiklenen geri çağırmadır
require_once __DIR__ . '/your/path/MessageHandler.php'; // Süreç başlatıldıktan sonra yüklenen dosyalar sıcak güncellemeyi destekler
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage'];
};
MessageHandler.php değiştirildikten sonra php start.php reload komutu çalıştırıldığında, MessageHandler.php yeniden yüklenerek iş mantığının güncellenmesi sağlanır.
İpucu
Yukarıdaki kod, gösterim kolaylığı içinrequire_onceifadesini kullanmıştır; projenizpsr4otomatik yüklemeyi destekliyorsa,require_onceifadesini çağırmanıza gerek yoktur.
Yumuşak Yeniden Başlatmanın Prensibi
Workerman, ana süreç ve alt süreçlere ayrılır; ana süreç, alt süreçleri izlemekle sorumludur, alt süreçler istemci bağlantılarını ve bağlantılar üzerinden gelen istek verilerini almak, uygun işlemleri yapmak ve istemciye verileri geri göndermekle sorumludur. İş kodu güncellendiğinde, aslında sadece alt süreçleri güncellememiz yeterlidir.
Workerman ana süreci yumuşak yeniden başlatma sinyali aldığında, ana süreç, bir alt sürece güvenli çıkış (ilgili sürecin mevcut isteği tamamladıktan sonra çıkmasını sağlar) sinyali gönderir; bu süreç çıktıktan sonra, ana süreç yeni bir alt süreç (bu alt süreç yeni PHP kodunu yüklemiştir) oluşturur. Ardından ana süreç tekrar başka bir eski sürece durdurma komutu gönderir; böylece her bir süreci sırayla yeniden başlatarak, tüm eski süreçler değişene kadar devam eder.
Görüyoruz ki yumuşak yeniden başlatma, eski iş süreçlerinin tek tek çıkmasını ve ardından her birinin yeni süreçler olarak yaratılmasını sağlamaktadır. Kullanıcıların etkilenmemesi için yumuşak yeniden başlatma sırasında, süreçlerin kullanıcıyla ilgili durum bilgilerini saklamaması gerektiği gerekliliği doğmaktadır; yani iş süreçlerinin mümkünse stateless (durumsuz) olması, süreçlerin çıkması nedeniyle bilgilerin kaybolmasını önlemek için en iyisidir.