程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> [PHP]swoole_server幾個進程的分工,swoole_server分工

[PHP]swoole_server幾個進程的分工,swoole_server分工

編輯:關於PHP編程

[PHP]swoole_server幾個進程的分工,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簡介
      • Swoole:重新定義PHP
      • 功能展示代碼片段
        • TCP Server
        • TCP Client
    • 主要進程分析
      • 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進程內的回調函數

onStart
onShutdown
onMasterConnect
onMasterClose
onTimer

Worker進程內的回調函數

onWorkerStart
onWorkerStop
onConnect
onClose
onReceive
onTimer
onFinish

Task進程內的回調函數

onTask
onWorkerStart

Manager進程內的回調函數

onManagerStart
onManagerStop

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved