[PHP]swoole_server幾個進程的分工
readme.md—/Users/zjh/Documents/我的文章/[PHP]swoole_server幾個進程的分工
[PHP]swoole_server進程的分工
摘要:Swoole是一個PHP語言的高效能網路通訊架構,提供了PHP語言的非同步多線程伺服器,非同步TCP/UDP網路用戶端,非同步MySQL,資料庫連接池,AsyncTask,訊息佇列,毫秒定時器,非同步檔案讀寫,非同步DNS查詢。強大的功能,由背後若干個分工明確的進程來實現,這裡詳細介紹下幾個進程的分工,以便入門者更快速的理解Swoole架構。
- 部落格: http://www.cnblogs.com/jhzhu
- 郵箱: jhzhuustc@gmail.com
- 作者: 知明所以
- 時間: 2015-08-17
目錄
- [PHP]swoole_server進程的分工
- 目錄
- Swoole簡介
- 主要進程分析
- Master進程
- Manager進程
- Worker進程
- Task進程
- 進程與事件回調的對應關係
- Master進程內的回呼函數
- Worker進程內的回呼函數
- Task進程內的回呼函數
- Manager進程內的回呼函數
Swoole簡介
Swoole官網
Swoole:重新定義PHP
Swoole:PHP語言的高效能網路通訊架構,提供了PHP語言的非同步多線程伺服器,非同步TCP/UDP網路用戶端,非同步MySQL,資料庫連接池,AsyncTask,訊息佇列,毫秒定時器,非同步檔案讀寫,非同步DNS查詢。Swoole雖然是標準的PHP擴充,實際上與普通的擴充不同。普通的擴充只是提供一個庫函數。而swoole擴充在運行後會接管PHP的控制權,進入事件迴圈。當IO事件發生後,swoole會自動回調指定的PHP函數。
功能展示程式碼片段
TCP Server
$serv = new swoole_server("127.0.0.1", 9501);$serv->set(array( 'worker_num' => 8, //背景工作處理序數量 'daemonize' => true, //是否作為守護進程));$serv->on('connect', function ($serv, $fd){ echo "Client:Connect.\n";});$serv->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, 'Swoole: '.$data); $serv->close($fd);});$serv->on('close', function ($serv, $fd) { echo "Client: Close.\n";});$serv->start();
TCP Client
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);//設定事件回呼函數$client->on("connect", function($cli) { $cli->send("hello world\n");});$client->on("receive", function($cli, $data){ echo "Received: ".$data."\n";});$client->on("error", function($cli){ echo "Connect failed\n";});$client->on("close", function($cli){ echo "Connection close\n";});//發起網路連接$client->connect('127.0.0.1', 9501, 0.5);
更多程式碼片段請見swoole官網。
主要進程分析
Master進程
Master進程主要用來保證Swoole架構機制的運行。它會建立幾個功能性的線程:
- Reactor線程:就是真正處理TCP串連,收發資料的線程。swoole的主線程在Accept新的串連後,會將這個串連分配給一個固定的Reactor線程,並由這個線程負責監聽此socket。在socket可讀時讀取資料,並進行協議解析,將請求投遞到Worker進程。在socket可寫時將資料發送給TCP用戶端。
- Master線程(主線程): 負責:Accept新的串連、UNIX PROXI訊號處理、定時器任務。
- 心跳包檢測線程:(略)
- UDP收包線程:(略)
Manager進程
swoole中Worker/Task進程都是由Manager進程Fork並管理的。
- 子進程結束運行時,manager進程負責回收此子進程,避免成為殭屍進程。並建立新的子進程
- 伺服器關閉時,manager進程將發送訊號給所有子進程,通知子進程關閉服務
- 伺服器reload時,manager進程會逐個關閉/重啟子進程
為什麼不是Master進程呢,主要原因是Master進程是多線程的,不能安全的執行fork操作。
Worker進程
- 接受由Reactor線程投遞的請求資料包,並執行PHP回呼函數處理資料
- 產生響應資料並發給Reactor線程,由Reactor線程發送給TCP用戶端
- 可以是非同步非阻塞模式,也可以是同步阻塞模式
- Worker以多進程的方式運行
Swoole提供了完善的進程管理機制,當Worker進程異常退出,如發生PHP的致命錯誤、被其他程式誤殺,或達到max_request次數之後正常退出。主進程會重新拉起新的Worker進程。 Worker進程內可以像普通的apache+php或者php-fpm中寫代碼。不需要像Node.js那樣寫非同步回調的代碼。
Task進程
- 接受由Worker進程通過swoole_server->task/taskwait方法投遞的任務
- 處理任務,並將結果資料返回給Worker進程
- 完全是同步阻塞模式
- Task以多進程的方式運行
Task進程的全稱是task_worker進程,是一種特殊的worker進程。所以onWorkerStart在task進程中也會被調用。當$worker_id >= $serv->setting['worker_num']時表示這個進程是task_worker,否則,代表此進程是worker進程。
進程與事件回調的對應關係
Master進程內的回呼函數
onStartonShutdownonMasterConnectonMasterCloseonTimer
Worker進程內的回呼函數
onWorkerStartonWorkerStoponConnectonCloseonReceiveonTimeronFinish
Task進程內的回呼函數
onTaskonWorkerStart
Manager進程內的回呼函數
onManagerStartonManagerStop