1. 程式人生 > >[PHP]swoole_server幾個程序的分工

[PHP]swoole_server幾個程序的分工

[PHP]swoole_server程序的分工

摘要:Swoole是一個PHP語言的高效能網路通訊框架,提供了PHP語言的非同步多執行緒伺服器,非同步TCP/UDP網路客戶端,非同步MySQL,資料庫連線池,AsyncTask,訊息佇列,毫秒定時器,非同步檔案讀寫,非同步DNS查詢。強大的功能,由背後若干個分工明確的程序來實現,這裡詳細介紹下幾個程序的分工,以便入門者更快速的理解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);

主要程序分析

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程序內的回撥函式

onStart
onShutdown
onMasterConnect
onMasterClose
onTimer

Worker程序內的回撥函式

onWorkerStart
onWorkerStop
onConnect
onClose
onReceive
onTimer
onFinish

Task程序內的回撥函式

onTask
onWorkerStart

Manager程序內的回撥函式

onManagerStart
onManagerStop