[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 servertcp client主要进程分析master进程manager进程worker进程task进程进程与事件回调的对应关系master进程内的回调函数worker进程内的回调函数task进程内的回调函数manager进程内的回调函数swoole简介swoole官网
swoole:重新定义phpswoole: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
http://www.bkjia.com/phpjc/1048730.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/1048730.htmltecharticle[php]swoole_server几个进程的分工,swoole_server分工 readme.md—/users/zjh/documents/我的文章/[php]swoole_server几个进程的分工 [php]swoole_server进程的分工...
