Swoole-2.1.2 进程池模块的使用
在?Swoole-2.1.2?
版本中我們將?Server?
的?進程?管理?模塊封裝成了?PHP?
類,現在可以在?PHP?
代碼?中使用?Swoole?
的進程管理器了。
在實際項目中經常需要寫一些長期運行的腳本,如基于?redis?
、?kafka?
、?rabbitmq?
實現的多進程隊列消費者,多進程爬蟲等等。?程序員?需要使用?pcntl?
和?posix?
相關的擴展庫實現多進程編程,需要?開發者?具備深厚的?Linux?
系統編程功底,否則很容易出現問題。
Swoole?
提供的進程管理器來自于?Swoole/Server?
,經過大量生產項目驗證,穩定性和健壯性都非常高。可大大簡化多進程腳本編程工作。
一、 創建進程池
在?PHP?
代碼中使用?new?Swoole/Process/Pool?
即可創建一個進程池,構造方法的第一個?參數?傳入工作進程的數量。使用?on?
方法設置?WorkerS?tar?t?
即可在工作進程啟動時執行指定的代碼,可以在這里進行?while(true)?
循環從?redis?
隊列中獲取任務并處理。使用?start?
方法啟動所有進程,管理器開始進入?wait?
狀態。
使用進程管理器,可以保證工作進程的穩定性。
- 某個工作進程遇到致命錯誤、主動退出時管理器會進行回收,避免出現僵尸進程
- 工作進程退出后,管理器會自動拉起、創建一個新的工作進程
二、信號處理
Swoole?
進程管理器自帶了信號處理,向管理器進程發送:
- SIGTERM?
信號:中止服務,向所有工作進程發送?SIGTERM?
關閉進程 - SIGUSR1?
信號:重啟工作進程,管理器會逐個重啟工作進程
在工作進程中可以配合使用?pcntl_signal?
和?pcntl_signal_dispatch?
實現信號處理。
三、任務投遞
Swoole?
進程管理器自帶了?消息隊列?和?TCP?-Socket?
消息投遞的支持。可設置監聽系統隊列或者?TCP?
端口?,接收任務?數據?。此項功能是可選的,要使用任務投遞功能,需要對進程池對象設置?onMessage?
回調。
消息隊列
$pool = new Swoole/Process/Pool(2, SWOOLE_IPC_MSGQUEUE, 0x7000001);$pool->on("Message", function ($pool, $message) {echo "Message: {$message}/n"; });$pool->start();需要在構造方法的第二個參數傳入?SWOOLE_IPC_MSGQUEUE?
,第三個參數設置監聽的消息隊列?KEY?
。其他程序中使用消息隊列相關?API?
就可以向工作進程投遞任務了。
TCP 端口
$pool = new Swoole/Process/Pool(2, SWOOLE_IPC_SOCKET); $pool->on("Message", function ($pool, $message) {echo "Message: {$message}/n"; }); $pool->listen('127.0.0.1', 8089); $pool->start();使用?TCP?
端口監聽,需要設置構造方法的第二個參數為?SWOOLE_IPC_SOCKET?
,并使用?listen?
方法設置監聽的?主機?和端口。
底層使用了?4?
字節長度+包體的?協議?。其他程序中向此端口發送數據時,需要在數據包之前增加一個長度字段。
原文
https?://segmentfault.com/a/1190000014303621
本站部分文章源于互聯網,本著傳播知識、有益學習和研究的目的進行的轉載,為網友免費提供。如有著作權人或出版方提出異議,本站將立即刪除。如果您對文章轉載有任何疑問請告之我們,以便我們及時糾正。?PS:如果您想和業內技術大牛交流的話,請加qq群(474807195)或者關注微信公眾號(AskHarries),謝謝!轉載請注明原文出處:?Harries Blog????Swoole-2.1.2 進程池模塊的使用
來源:http://ju.outofmemory.cn/entry/350679
總結
以上是生活随笔為你收集整理的Swoole-2.1.2 进程池模块的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 送人的购物卡怎么办理
- 下一篇: Crontab的格式