测试的代码主要功能:开启一个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进程的启动顺序,以及演示如何停止或者重启服务端。的更多相关文章

  1. 进程池与线程池、协程、协程实现TCP服务端并发、IO模型

    进程池与线程池.协程.协程实现TCP服务端并发.IO模型 一.进程池与线程池 1.线程池 ''' 开进程开线程都需要消耗资源,只不过两者比较的情况下线程消耗的资源比较少 在计算机能够承受范围内最大限度 ...

  2. nignx的master进程和worker进程的作用

    ngnix进程启动启动后会有一个master进程和多个worker进程. master进程的主要作用: 1.读取并验证配置信息: 2.创建,绑定及关闭套接字: 3.启动,终止worker进程以及维护w ...

  3. nginx worker进程循环

    worker进程启动后,其首先会初始化自身运行所需要的环境,然后会进入一个循环,在该循环中不断检查是否有需要执行的事件,然后处理事件.在这个过程中,worker进程也是需要与master进程交互的,更 ...

  4. nginx——优化 Nginx worker 进程数

    Nginx 有 Master 和 worker 两种进程,Master 进程用于管理 worker 进程,worker 进程用于 Nginx 服务 worker 进程数应该设置为等于 CPU 的核数, ...

  5. <spark> error:启动spark后查看进程,进程中master和worker进程冲突

    启动hadoop再启动spark后jps,发现master进程和worker进程同时存在,调试了半天配置文件. 测试发现,当我关闭hadoop后 worker进程还是存在, 但是,当我再关闭spark ...

  6. Zabbix 5.0:服务端进程总结

    Blog:博客园 个人 参考:<深入理解Zabbix监控系统>.<Zabbix用户手册> Zabbix服务端进程被分为不同的种类,每一种进程负责相应的任务,包括收集原始监控数据 ...

  7. Linux中查看进程及杀死进程命令

    Linux中想杀死fcitx进程,然后再重启它. root@www.linuxidc.com:/home/zhangbin# ps -e | grep 'fcitx' 3405 ?        00 ...

  8. Nginx(二): worker 进程处理逻辑-流程框架

    Nginx 启动起来之后,会有几个进程运行:1. master 进程接收用户命令并做出响应; 2. worker 进程负责处理各网络事件,并同时接收来自master的处理协调命令: master 主要 ...

  9. twitter storm 源码走读之5 -- worker进程内部消息传递处理和数据结构分析

    欢迎转载,转载请注明出处,徽沪一郎. 本文从外部消息在worker进程内部的转化,传递及处理过程入手,一步步分析在worker-data中的数据项存在的原因和意义.试图从代码实现的角度来回答,如果是从 ...

随机推荐

  1. Oracle表空间不足;查询表空间使用率(unable to extend lob segment SYS_LOB0000076749C00006$$ by 8192 in tablespace USERS)

    查询表空间对应地址 *),) total_space from dba_data_files order by tablespace_name; //方案一:修改表空间大小(32000可改为想要的数值 ...

  2. centos7配置yum本地源(iso镜像)及局域网使用

    2.测试环境: 服务器1:44.135.8.19(yum源) 服务器2:44.135.8.1(局域网机器) 系统:centos7.4 上传iso镜像到服务器,并挂载iso镜像 mount -t iso ...

  3. 列表推导式和sum的用法

    作者:杨航锋链接:https://www.zhihu.com/question/57470958/answer/153405326来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  4. Android Jetpack 组建介绍(一)——Lifecycler

    转自带你领略Android Jetpack组件的魅力 Android Jetpack 对于任何一个产品来说,我们开发中都会面对哪些问题?如:产品交互.用户体验.代码结构.数据获取.数据存储.网络优化. ...

  5. Python 3.7 安装Twisted

    win10电脑  64位系统 Python 3.7 版本安装Twisted-18.9.0-cp37-cp37m-win32.whl 会成功 先下载下来,放到 Scripts文件夹下 然后cmd 我的是 ...

  6. 三个猜数字游戏代码(Python)

    def binary_search(list,item): low = 0 high = len(list)-1 while low <= high: mid = (low + high)//2 ...

  7. 【转】BFG Repo-Cleaner: Removes large or troublesome blobs like git-filter-branch does, but faster.

    https://rtyley.github.io/bfg-repo-cleaner/ an alternative to git-filter-branch The BFG is a simpler, ...

  8. query did not return a unique result: 2错误的发生

    org.springframework.dao.IncorrectResultSizeDataAccessException: query did not return a unique result ...

  9. Neural Network Virtual Machine

    深度学习Stack 为什么提出NNVM? 深度学习框架现状 - “碎片化” 目前,深度学习应用框架呈现出高度的“碎片化(fragmentation)”倾向,这主要是由于下述两个原因: 1. 深度学习正 ...

  10. Adobe Flash player ActiveX下载地址

    http://www.adobe.com/support/flashplayer/downloads.html http://download.macromedia.com/pub/flashplay ...