Swoole 理解manager进程和worker进程的启动顺序…
2018-08-26 17:32:06来源:博客园 阅读 ()
测试的代码主要功能:开启一个tcp服务器。然后设置了管理进程和工作进程start的回调进行更名。设置了pid_file保存了服务端启动的mast进程。
<?php //创建Server对象,监听 127.0.0.1:9501端口 $serv = new swoole_server("127.0.0.1", 9501); $serv->set(array( 'max_request ' => 10, //reactor thread num 'worker_num' => 4, //worker process num 'log_file' => 'swoole.log', 'pid_file' => 'server.pid', )); $serv->on('managerStart',function($serv){ swoole_set_process_name("managerprocess"); }); $serv->on('workerStart',function($serv, $worker_id){ if($worker_id >= $serv->setting['worker_num']) { swoole_set_process_name("workprocess_".($worker_id-$serv->setting['worker_num'])); } else { swoole_set_process_name("workprocess_{$worker_id}"); } }); $serv->on('start',function($serv){ echo "到这一步说明服务已经起来了,manager,work都已经回调start完成"; }); //监听连接进入事件 $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"; }); //启动服务器 $serv->start();
开启服务器后
查看进程,在server->start 后,拉起workNum+2(master,manager进程)。
然后查看pid_file里的master进程id是否是1827,上图所示。结果显然是一致的
下面写一个脚本去重启和停止服务端。(原理就是给mast进程发送信号)
<?php $options = 's'; $command = getopt($options); $pidFile = 'server.pid'; if(isset($command['s'])){ if($command['s']=='stop'){ stop(); }else{ reload(); } }else{ die("请输入-s stop|reload"); } function stop(){ global $pidFile; if (file_exists($pidFile)) { $pid = file_get_contents($pidFile); if (!swoole_process::kill($pid, 0)) { echo "PID :{$pid} not exist \n"; return false; } swoole_process::kill($pid); //等待5秒 $time = time(); $flag = false; while (true) { usleep(1000); if (!swoole_process::kill($pid, 0)) { echo "server stop at " . date("y-m-d h:i:s") . "\n"; if (is_file($pidFile)) { unlink($pidFile); } $flag = true; break; } else { if (time() - $time > 5) { echo "stop server fail.try again \n"; break; } } } return $flag; } else { echo "pid 文件不存在,请执行查找主进程pid,kill!\n"; return false; } } function reload(){ global $pidFile; if (file_exists($pidFile)) { $sig = SIGUSR1; $pid = file_get_contents($pidFile); if (!swoole_process::kill($pid, 0)) { echo "pid :{$pid} not exist \n"; return; } swoole_process::kill($pid, $sig); echo "send server reload command at " . date("y-m-d h:i:s") . "\n"; } else { echo "pid 文件不存在,请执行查找主进程pid,kill!\n"; } }
先执行重启
再查看进程
主进程还是1827,但是工作进程就被reload的了。
然后执行退出
查看进程确实不见了
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PHP多进程编程之僵尸进程问题的理解 2020-02-17
- 分析php中注册器模式类用法实例 2019-12-02
- 深入理解require与require_once与include以及include_once的 2019-10-28
- 定义php常量的详解 2019-10-25
- mac php Swoole入门 2019-07-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash