[PHP]swoole_server幾個過程的分工

來源:互聯網
上載者:User
[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簡介
      • 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進程內的回呼函數

onStartonShutdownonMasterConnectonMasterCloseonTimer

Worker進程內的回呼函數

onWorkerStartonWorkerStoponConnectonCloseonReceiveonTimeronFinish

Task進程內的回呼函數

onTaskonWorkerStart

Manager進程內的回呼函數

onManagerStartonManagerStop

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.