[PHP]swoole_server幾個進程的分工


[PHP]swoole_server進程的分工


摘要:Swoole是一個PHP語言的高性能網絡通信框架,提供了PHP語言的異步多線程服務器,異步TCP/UDP網絡客戶端,異步MySQL,數據庫連接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢。強大的功能,由背后若干個分工明確的進程來實現,這里詳細介紹下幾個進程的分工,以便入門者更快速的理解Swoole框架。



目錄

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進程內的回調函數

onStart
onShutdown
onMasterConnect
onMasterClose
onTimer

Worker進程內的回調函數

onWorkerStart
onWorkerStop
onConnect
onClose
onReceive
onTimer
onFinish

Task進程內的回調函數

onTask
onWorkerStart

Manager進程內的回調函數

onManagerStart
onManagerStop


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM