首頁 >後端開發 >php教程 >[PHP]swoole_server幾個進程的分工

[PHP]swoole_server幾個進程的分工

WBOY
WBOY原創
2016-07-30 13:30:27909瀏覽

[PHP]swoole_server進程的分工


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


  • 博客: http://www.cnblogs.com/jhzhu
  • 郵箱: jhzhuustc@gmail.com
  • 作者: 知明所以
  • 時間: 2015-08-1773-08-17
  • [PHP]swoole_server程式的分工

目錄

Swoole簡介

    Swoole:重新定義PHP
    • 功能展示程式碼片段
    • TCPMaster
    • TCP.
      • Manager程序
      • Worker進程
        • Task進程
        程序與事件回調的對應關係
      Master進程內的回呼函數
    • askWorker的回呼函數
      • Swoole簡介
      Swoole官網
    • Swoole:重新定義PHP
      • Swoole:PHPTCPTC/PHPTC 的網路語言框架,提供了多步語言的 PHTC UDP網路客戶端,非同步MySQL,資料庫連線池,AsyncTask,訊息佇列,毫秒定時器,非同步檔案讀寫,非同步DNS查詢。 Swoole雖然是標準的PHP擴展,實際上與普通的擴展不同。普通的擴充只是提供一個函式庫函數。而swoole擴充在運作後會接管PHP的控制權,進入事件循環。當IO事件發生後,swoole會自動回調指定的PHP函數。
      • 功能展示程式碼片段
      • TCP Server
      • <span>$serv = new swoole_server("127.0.0.1", 9501);</span><span>$serv->set(array(</span><span>    'worker_num' => 8,   //工作进程数量</span><span>    'daemonize' => true, //是否作为守护进程</span><span>));</span><span>$serv->on('connect', function ($serv, $fd){</span><span>    echo "Client:Connect.\n";</span><span>});</span><span>$serv->on('receive', function ($serv, $fd, $from_id, $data) {</span><span>    $serv->send($fd, 'Swoole: '.$data);</span><span>    $serv->close($fd);</span><span>});</span><span>$serv->on('close', function ($serv, $fd) {</span><span>    echo "Client: Close.\n";</span><span>});</span><span>$serv->start();</span>
      TCP Client
    <span>$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);</span><span>//设置事件回调函数</span><span>$client->on("connect", function($cli) {</span><span>    $cli->send("hello world\n");</span><span>});</span><span>$client->on("receive", function($cli, $data){</span><span>    echo "Received: ".$data."\n";</span><span>});</span><span>$client->on("error", function($cli){</span><span>    echo "Connect failed\n";</span><span>});</span><span>$client->on("close", function($cli){</span><span>    echo "Connection close\n";</span><span>});</span><span>//发起网络连接</span><span>$client->connect('127.0.0.1', 9501, 0.5);</span>
更多程式碼片段請見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執行緒,由ReactorcobTCP客戶端

模式,也可以是同步阻塞模式

    Worker以多進程的方式運行
  • Swoole提供了完善的進程管理機制,當Worker進程異常退出,如發生PHP的致命錯誤、被其他程序誤殺,或達到max_request次數之後正常退出。主進程會重新拉起新的Worker進程。 Worker進程內可以像普通的apache+php或php-fpm寫程式碼。不需要像Node.js那樣寫非同步回呼的程式碼。
Task進程

接受由Worker進程通過swoole_server->task/taskwait方法投遞的任務

處理任務,並將結果資料傳回給Worker進程

以同步進程方式運行
  • Task進程的全名是task_worker進程,是一種特殊的worker進程。所以
  • onWorkerStart
  • 在task進程中也會被呼叫。當
  • $worker_id >= $serv->setting['worker_num']
  • 時表示這個程序是task_worker,否則,代表此程序是worker程序。
  • 進程與事件回調的對應關係
Master進程內的回呼函數

<span>onStart</span><span>onShutdown</span><span>onMasterConnect</span><span>onMasterClose</span><span>onTimer</span>

Worker進程內的回呼函數

    <span>onWorkerStart</span><span>onWorkerStop</span><span>onConnect</span><span>onClose</span><span>onReceive</span><span>onTimer</span><span>onFinish</span>
  • Task進程內的回呼函數
  • <span>onTask</span><span>onWorkerStart</span>
  • 以上就介紹了[PHP]swoole_server幾個進程的分工,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

  • 陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn