Swoole 理解manager进程和worker进程的启动顺序,以及演示如何停止或者重启服务端。
测试的代码主要功能:开启一个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的了。
然后执行退出

查看进程确实不见了
Swoole 理解manager进程和worker进程的启动顺序,以及演示如何停止或者重启服务端。的更多相关文章
- 进程池与线程池、协程、协程实现TCP服务端并发、IO模型
进程池与线程池.协程.协程实现TCP服务端并发.IO模型 一.进程池与线程池 1.线程池 ''' 开进程开线程都需要消耗资源,只不过两者比较的情况下线程消耗的资源比较少 在计算机能够承受范围内最大限度 ...
- nignx的master进程和worker进程的作用
ngnix进程启动启动后会有一个master进程和多个worker进程. master进程的主要作用: 1.读取并验证配置信息: 2.创建,绑定及关闭套接字: 3.启动,终止worker进程以及维护w ...
- nginx worker进程循环
worker进程启动后,其首先会初始化自身运行所需要的环境,然后会进入一个循环,在该循环中不断检查是否有需要执行的事件,然后处理事件.在这个过程中,worker进程也是需要与master进程交互的,更 ...
- nginx——优化 Nginx worker 进程数
Nginx 有 Master 和 worker 两种进程,Master 进程用于管理 worker 进程,worker 进程用于 Nginx 服务 worker 进程数应该设置为等于 CPU 的核数, ...
- <spark> error:启动spark后查看进程,进程中master和worker进程冲突
启动hadoop再启动spark后jps,发现master进程和worker进程同时存在,调试了半天配置文件. 测试发现,当我关闭hadoop后 worker进程还是存在, 但是,当我再关闭spark ...
- Zabbix 5.0:服务端进程总结
Blog:博客园 个人 参考:<深入理解Zabbix监控系统>.<Zabbix用户手册> Zabbix服务端进程被分为不同的种类,每一种进程负责相应的任务,包括收集原始监控数据 ...
- Linux中查看进程及杀死进程命令
Linux中想杀死fcitx进程,然后再重启它. root@www.linuxidc.com:/home/zhangbin# ps -e | grep 'fcitx' 3405 ? 00 ...
- Nginx(二): worker 进程处理逻辑-流程框架
Nginx 启动起来之后,会有几个进程运行:1. master 进程接收用户命令并做出响应; 2. worker 进程负责处理各网络事件,并同时接收来自master的处理协调命令: master 主要 ...
- twitter storm 源码走读之5 -- worker进程内部消息传递处理和数据结构分析
欢迎转载,转载请注明出处,徽沪一郎. 本文从外部消息在worker进程内部的转化,传递及处理过程入手,一步步分析在worker-data中的数据项存在的原因和意义.试图从代码实现的角度来回答,如果是从 ...
随机推荐
- GC的过程
哪些内存需要GC 判断对象是否还存活 引用计数法 给对象中添加一个引用计数器,每当一个地方引用它时,计数器值就加1:当引用失效时,计数器的值就减1,任何时候计数器为0的对象就是不可能再被使用的. 微软 ...
- MySQL实现分组取组内特定数据的功能
需求:在MySQL5.7环境下,查询下面表中,各个学科前两名的学生的成绩: 1.准备数据 窗机表以及向表中插入数据 创建一张表: DROP TABLE IF EXISTS `grade`; CREAT ...
- python 运用numpy库与matplotlib库绘制数据图
代码一 import numpy as np import matplotlib.pyplot as plt x=np.linspace(0,6,100) y=np.cos(2*np.pi*x)*np ...
- (23/24) webpack实战技巧:如何在webpack环境中使用Json
在webpack1或者webpack2版本中,若想在webpack环境中加载Json文件,则需要加载一个json-loader的loader进来的.但是在webpack3.x版本中,则不需要在另外引入 ...
- python shutil模块&random模块
shutil模块 import shutil shutil.copyfileobj(open("os_.py", "r"), open("os_2.p ...
- signalR客户端调用服务端方法失败
现象: 在VS中修改集线器代码后,重新生成解决方案,客户端js调用服务端方法提示undefined. 检查后台代码未发现错误. 检查js代码未发现错误(方法名称符合小驼峰规范). 解决方法: 先清理解 ...
- 原生js开发vue的双向数据绑定
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- The type initializer for System.Data.SqlClient.SqlConnection threw an exception
The type initializer for System.Data.SqlClient.SqlConnection threw an exception net framwork啥原因 xp电脑
- activiti官网实例项目activiti-explorer之扩展流程节点属性2
情景需求:需要查找activiti-explorer项目中获取流程id的方法,然后根据流程id获取相应字段在节点属性中添加内容. 大致流程:拿取整个流程id获取对应表单属性,在页面节点属性中展示对应表 ...
- Selenium分布式自动化测试平台 Standalone Server 4.0 搭建
最新的selenium测试平台大概有这么几个组件 Selenium Standalone Server: 用来搭建远程测试平台以及分布式测试. Selenium WebDriver: 最基础的用来创建 ...