ホームページ >php教程 >php手册 >[PHP]swoole_server几个进程的分工,swoole_server分工

[PHP]swoole_server几个进程的分工,swoole_server分工

WBOY
WBOYオリジナル
2016-06-13 08:56:001331ブラウズ

[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

<span class="x">$serv = new swoole_server("127.0.0.1", 9501);</span>
<span class="x">$serv->set(array(</span>
<span class="x">    &#39;worker_num&#39; => 8,   //工作进程数量</span>
<span class="x">    &#39;daemonize&#39; => true, //是否作为守护进程</span>
<span class="x">));</span>
<span class="x">$serv->on(&#39;connect&#39;, function ($serv, $fd){</span>
<span class="x">    echo "Client:Connect.\n";</span>
<span class="x">});</span>
<span class="x">$serv->on(&#39;receive&#39;, function ($serv, $fd, $from_id, $data) {</span>
<span class="x">    $serv->send($fd, &#39;Swoole: &#39;.$data);</span>
<span class="x">    $serv->close($fd);</span>
<span class="x">});</span>
<span class="x">$serv->on(&#39;close&#39;, function ($serv, $fd) {</span>
<span class="x">    echo "Client: Close.\n";</span>
<span class="x">});</span>
<span class="x">$serv->start();</span>

TCP Client

<span class="x">$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);</span>
<span class="x">//设置事件回调函数</span>
<span class="x">$client->on("connect", function($cli) {</span>
<span class="x">    $cli->send("hello world\n");</span>
<span class="x">});</span>
<span class="x">$client->on("receive", function($cli, $data){</span>
<span class="x">    echo "Received: ".$data."\n";</span>
<span class="x">});</span>
<span class="x">$client->on("error", function($cli){</span>
<span class="x">    echo "Connect failed\n";</span>
<span class="x">});</span>
<span class="x">$client->on("close", function($cli){</span>
<span class="x">    echo "Connection close\n";</span>
<span class="x">});</span>
<span class="x">//发起网络连接</span>
<span class="x">$client->connect(&#39;127.0.0.1&#39;, 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进程会逐个关闭/重启子进程
<p>为什么不是Master进程呢,主要原因是Master进程是多线程的,不能安全的执行fork操作。</p>

Worker进程

  • 接受由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据
  • 生成响应数据并发给Reactor线程,由Reactor线程发送给TCP客户端
  • 可以是异步非阻塞模式,也可以是同步阻塞模式
  • Worker以多进程的方式运行
<p>Swoole提供了完善的进程管理机制,当Worker进程异常退出,如发生PHP的致命错误、被其他程序误杀,或达到max_request次数之后正常退出。主进程会重新拉起新的Worker进程。 Worker进程内可以像普通的apache+php或者php-fpm中写代码。不需要像Node.js那样写异步回调的代码。</p>

Task进程

  • 接受由Worker进程通过swoole_server->task/taskwait方法投递的任务
  • 处理任务,并将结果数据返回给Worker进程
  • 完全是同步阻塞模式
  • Task以多进程的方式运行

Task进程的全称是task_worker进程,是一种特殊的worker进程。所以onWorkerStart在task进程中也会被调用。当$worker_id >= $serv->setting['worker_num']时表示这个进程是task_worker,否则,代表此进程是worker进程。

进程与事件回调的对应关系

Master进程内的回调函数

<span class="x">onStart</span>
<span class="x">onShutdown</span>
<span class="x">onMasterConnect</span>
<span class="x">onMasterClose</span>
<span class="x">onTimer</span>

Worker进程内的回调函数

<span class="x">onWorkerStart</span>
<span class="x">onWorkerStop</span>
<span class="x">onConnect</span>
<span class="x">onClose</span>
<span class="x">onReceive</span>
<span class="x">onTimer</span>
<span class="x">onFinish</span>

Task进程内的回调函数

<span class="x">onTask</span>
<span class="x">onWorkerStart</span>

Manager进程内的回调函数

<span class="x">onManagerStart</span>
<span class="x">onManagerStop</span>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。