文章插图
现在,我们基于上面的例子修改代码,来看看一个简单的多进程Swoole Server的几个基本配置:
PHP5.5或更高版本PHP7.0.13或更高版本reactor_num:表示Master进程中,Reactor线程总共开多少个,注意,这个可不是越多越好,因为计算机的CPU是有限的,所以一般设置为与CPU核心数量相同,或者两倍即可 。
worker_num:表示启动多少个Worker进程,同样,Worker进程数量不是越多越好,仍然设置为与CPU核心数量相同,或者两倍即可 。
我们可以在Shell里运行,使用pstree查看进程模型结构:
php swoole_tcp_server.phppstree -ap|grep swoole_tcp | | `-php,2505 swoole_tcp_server.php | | |-php,2507 swoole_tcp_server.php | | | |-php,2510 swoole_tcp_server.php | | | |-php,2511 swoole_tcp_server.php | | | |-php,2512 swoole_tcp_server.php | | | `-php,2513 swoole_tcp_server.php回调函数
Swoole作为Server时,回调函数有很多 。但可以简单分个类:
1) 进程启动时执行的:onStart、onManagerStart、onWorkerStart;onWorkerStop、onManagerStop、onShutdown;onWorkerError
2) 客户端交互时触发的:onReceive/onRequest/onPacket/onMessage、onOpen/onConnect、onClose
3) Task:onTask、onFinish
4) Timer:onTimer
事件执行顺序:
- 所有事件回调均在$server->start后发生
- 服务器关闭程序终止时最后一次事件是onShutdown
- 服务器启动成功后,onStart/onManagerStart/onWorkerStart会在不同的进程内并发执行 。
- onReceive/onConnect/onClose/onTimer在worker进程(包括task进程)中各自触发
- worker/task进程启动/结束时会分别调用onWorkerStart/onWorkerStop
- onTask事件仅在task进程中发生
- onFinish事件仅在worker进程中发生
- onStart/onManagerStart/onWorkerStart 3个事件的执行顺序是不确定的
- UDP协议下只有onReceive事件,没有onConnect/onClose事件
- 如果未设置onPacket回调函数,收到UDP数据包默认会回调onReceive函数
- onOpen事件回调是可选的:当WebSocket客户端与服务器建立连接并完成握手后会回调此函数
示例:
<?php$server = new swoole_server("127.0.0.1",8088);$server->set(array( 'daemonize' => false, 'reactor_num' => 2, 'worker_num' => 4));$server->on('connect', function ($serv, $fd){echo "client connect. fd is {$fd}n";});$server->on('receive', function ($serv, $fd, $from_id, $data){ echo "client connect. fd is {$fd}n";});$server->on('close', function ($serv, $fd){ echo "client close. fd is {$fd}n";});// 以下回调发生在Master进程$server->on("start", function (swoole_server $server){ echo "On master start.n";});$server->on('shutdown', function (swoole_server $server){ echo "On master shutdown.n";});// 以下回调发生在Manager进程$server->on('ManagerStart', function (swoole_server $server){ echo "On manager start.n";});$server->on('ManagerStop', function (swoole_server $server){ echo "On manager stop.n";});// 以下回调也发生在Worker进程$server->on('WorkerStart', function (swoole_server $server, $worker_id){ echo "Worker startn";});$server->on('WorkerStop', function(swoole_server $server, $worker_id){ echo "Worker stopn";});$server->on('WorkerError', function(swoole_server $server, $worker_id, $worker_pid, $exit_code){ echo "Worker errorn";});$server -> start();编程须知
- 不要在代码中执行sleep以及其他睡眠函数,这样会导致整个进程阻塞
- exit/die是危险的,会导致worker进程退出
- 可通过register_shutdown_function来捕获致命错误,在进程异常退出时做一些请求工作,具体参看/wiki/page/305.html
推荐阅读
- 铁观音名缘何来及制作技艺简介
- 乌龙茶基地种植技术简介
- 最受文科生青睐的十所二本院校 二本文科大学
- hash 算法原理及应用漫谈
- 一分钟带你了解JWT认证
- 傣族服饰特点及风格 傣族服饰特点简介
- 面试到底如何辨别不靠谱公司?
- 臭鼬从哪里喷臭气 臭鼬怎样喷射臭味
- 如何快速学习一门新的编程语言?
- 平遥古城5个必去景点 平遥古城简介