2.3 worker
worker 进程属于swoole的主逻辑进程,用户处理客户端的一系列请求,接受由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据生成响应数据并发给Reactor线程,由Reactor线程发送给TCP客户端可以是异
步非阻塞模式,也可以是同步阻塞模式
2.4 task
taskWorker进程这一进城是swoole提供的异步工作进程,这些进程主要用于处理一些耗时较长的同步任务,在worker进程当中投递过来。
3. 进程查看及流程梳理
当启动一个Swoole应用时,一共会创建2 + n + m个进程,2为一个Master进程和一个Manager进程,其中n为Worker进程数。m为TaskWorker进程数。
默认如果不设置,swoole底层会根据当前机器有多少CPU核数,启动对应数量的Reactor线程和Worker进程。我机器为1核的。Worker为1。
所以现在默认我启动了1个Master进程,1个Manager进程,和1个worker进程,TaskWorker没有设置也就是为0,当前server会产生3个进程。
在启动了server之后,在命令行查看当前产生的进程
如上的表格就是swoole的进程可以绑定的时间, 并不是所有的;比如在启动的时候做的操作,那么就会触发启动的事件,发送信息的时候会触发的事件;
swoole对于不同的进程,在不同的情况下就定义了不同的事件,这里可以像大家介绍一下事件的使用与其效果,但是并不是所有的事件。
我们可以看一下swoole在官方所提供的swoole运行流程图
1. 服务器关闭程序终止时最后一次事件是onShutdown。
2. 服务器启动成功后,onStart/onManagerStart/onWorkerStart会在不同的进程内并发执 行,并不是顺序的。
3. 所有事件回调均在$server->start后发生,start之后写的代码是无效代码。
4. onStart/onManagerStart/onWorkerStart 3个事件的执行顺序是不确定的
Swoole的Reactor、Worker、TaskWorker之间可以紧密的结合起来,提供更高级的使用方式。
一个更通俗的比喻,假设Server就是一个工厂,那Reactor就是销售,接受客户订单。而Worker就是工人,当销售接到订单后,Worker去工作生产出客户要的东西。而TaskWorker可以理解为行政人员,可以帮助Worker干
些杂事,让Worker专心工作。
比如我们可以尝试对于swoole的进程更名称
//创建Server对象,监听 127.0.0.1:9501端口
$serv = new Swoole\Server("127.0.0.1", 9501); $serv->set([ 'worker_num' => 1 ]); $serv->on('start', function () { swoole_set_process_name("swoole:start"); echo "设置swoole 进程 xxx swoole:start \n";
}); $serv->on('managerStart', function () { swoole_set_process_name("swoole:managerStart"); echo "设置swoole 进程 xxx swoole:managerStart \n";
}); $serv->on('workerStart', function () { swoole_set_process_name("swoole:workerStart"); echo "设置swoole 进程 xxx swoole:workerStart \n";
}); //监听连接进入事件
$serv->on('Connect', function ($serv, $fd) { echo "Client: Connect.\n";
}); //监听数据接收事件
$serv->on('Receive', function ($serv, $fd, $from_id, $data) {$serv->send($fd, "Server: ".$data);
}); //监听连接关闭事件
$serv->on('Close', function ($serv, $fd) { echo "Client: Close.\n";
}); echo "启动swoole tcp server 访问地址 127.0.0.1:9501\n";
//启动服务器
$serv->start();
?>
建议大家在平时的工作中可以看看swoole手册中的高级部分,因为对于swoole的理解会更加好一点
swoole中的Reactor https://wiki.swoole.com/wiki/page/163.html
1. Reactor是管理tcp连接的, 并向worker进程投递请求,投递方式根据dispatch_mode配置。
2. worker进程可以自己处理任务,也可以投递给taskworker进程来做。