在swoole中,我們可以向主程序發送各種不同的訊號,主程序根據接收到的訊號類型做出不同的處理。
例如下面這幾個 (建議學習: swoole視訊教學)
1、kill -SIGTERM|-15 master_pid 终止Swoole程序,一种优雅的终止信号,会待进程执行完当前程序之后中断,而不是直接干掉进程 2、kill -USR1|-10 master_pid 重启所有的Worker进程 3、kill -USR2|-12 master_pid 重启所有的Task Worker进程
當USR1訊號傳送給Master進程後,Master進程同樣會同樣地的訊號透過Manager進程轉送Worker進程,收到此訊號的Worker進程會在處理完正在執行的邏輯之後,釋放進程內存,關閉自己,然後由Manager進程重啟一個新的Worker進程。
新的Worker進程會佔用新的記憶體空間。
場景:
如果是上線的項目,一台繁忙的後端伺服器隨時都在處理請求,如果管理員透過kill進程方式來終止/重啟伺服器程序,可能導致剛好程式碼執行到一半終止。
這種情況下會產生資料的不一致。
如交易系統中,支付邏輯的下一段是發貨,假設在支付邏輯之後進程被終止了。會導致用戶支付了貨幣,但並沒有發貨,後果非常嚴重。
swoole為我們提供了平滑重啟機制,我們只需要向swoole_server的主程序發送特定的訊號,即可完成對server的重新啟動。
注意事項:
1、更新僅只是針對worker進程,在worker 進程當中include 也就是寫在master進程跟manger進程當中更新程式碼並不生效,也就是說只有在onWorkerStart回呼之後載入的文件,重啟才有意義。
在Worker進程啟動之前就已經載入到記憶體中的文件,如果想讓它重新生效,只能關閉server再重新啟動。
2、直接寫在worker程式碼當中的邏輯是不會生效的,就算發送了訊號也不會,需要透過include方式引入相關的業務邏輯程式碼才會生效
以上是swoole如何重啟的詳細內容。更多資訊請關注PHP中文網其他相關文章!