[PHP]swoole_server幾個進程的分工

[PHP]swoole_server進程的分工


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



目錄

Swoole簡介

Swoole官網css

Swoole:從新定義PHP

Swoole:PHP語言的高性能網絡通訊框架,提供了PHP語言的異步多線程服務器,異步TCP/UDP網絡客戶端,異步MySQL,數據庫鏈接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢。 Swoole雖然是標準的PHP擴展,實際上與普通的擴展不一樣。普通的擴展只是提供一個庫函數。而swoole擴展在運行後會接管PHP的控制權,進入事件循環。當IO事件發生後,swoole會自動回調指定的PHP函數。html

功能展現代碼片斷

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官網git

主要進程分析

Master進程

Master進程主要用來保證Swoole框架機制的運行。它會建立幾個功能性的線程:github

  • Reactor線程:就是真正處理TCP鏈接,收發數據的線程。swoole的主線程在Accept新的鏈接後,會將這個鏈接分配給一個固定的Reactor線程,並由這個線程負責監聽此socket。在socket可讀時讀取數據,並進行協議解析,將請求投遞到Worker進程。在socket可寫時將數據發送給TCP客戶端。
  • Master線程(主線程): 負責:Accept新的鏈接、UNIX PROXI信號處理、定時器任務。
  • 心跳包檢測線程:(略)
  • UDP收包線程:(略)

Manager進程

swoole中Worker/Task進程都是由Manager進程Fork並管理的。web

  • 子進程結束運行時,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那樣寫異步回調的代碼。apache

Task進程

  • 接受由Worker進程經過swoole_server->task/taskwait方法投遞的任務
  • 處理任務,並將結果數據返回給Worker進程
  • 徹底是同步阻塞模式
  • Task以多進程的方式運行

Task進程的全稱是task_worker進程,是一種特殊的worker進程。因此onWorkerStart在task進程中也會被調用。當$worker_id >= $serv->setting['worker_num']時表示這個進程是task_worker,不然,表明此進程是worker進程。canvas

進程與事件回調的對應關係

Master進程內的回調函數

onStart
onShutdown
onMasterConnect
onMasterClose
onTimer

Worker進程內的回調函數

onWorkerStart
onWorkerStop
onConnect
onClose
onReceive
onTimer
onFinish

Task進程內的回調函數

onTask
onWorkerStart

Manager進程內的回調函數

onManagerStart
onManagerStop
相關文章
相關標籤/搜索