测试的代码主要功能:开启一个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. Comparator与Comparable,自定义排序和类比较器,TreeSet对象排序

    /** * 学生类 * @author Administrator * */ public class Student { private String sno ; private String sn ...

  2. Python 有道翻译 爬虫 有道翻译API 突破有道翻译反爬虫机制

    py2.7 #coding: utf-8 import time import random import hashlib import requests while(1): url = 'http: ...

  3. [UnityShader基础]08.UI-Default.shader

    参考链接: https://zhuanlan.zhihu.com/p/32561155 https://blog.csdn.net/WuShangLZ/article/details/80401441 ...

  4. 编译pcre 报错 error: Invalid C++ compiler or C++ compiler flags

    安装c++ 编译器:yum -y install gcc-c++ ,再次编译通过.

  5. 关于XML的小思考

    最近一段时间又接触了XML语言,现在看来它是一种可扩展标记语言,它的格式是标签语言,例如<>****<>此类,它在动态编译中有重要的作用,举个例子,一个班级里有37个人,到学期 ...

  6. frist Django app — 五、Test

    Test——很重要但是没有被重视起来的一个环节,至少是我自己,其实自己之前在做java web的时候就去尝试过怎么做REST接口的测试,一直没有找到一种合适方式,而且因为时间紧没有进一步深究,但是造成 ...

  7. ssh 使用技巧

    参考:https://deepzz.com/post/how-to-setup-ssh-config.html SSH Config 那些你所知道和不知道的事 预览目录 配置项说明 相关技巧 管理多组 ...

  8. Cookie在前端读不到 多半是因为Cookie在服务器端的设置是HttpOnly 意味着只能在后台操作Cookie

    比如Shiro框架的 RememberMe Cookie 是不允许Js进行读写的 只能在服务器端通过同一个域的请求获得 import com.constantine.forum.exception.F ...

  9. 004之MFCSocket同步编程(指针机制)

    异步与同步通信相比较,前者是非阻塞模式,后者是阻塞模式.有关两者差异在此博主中有详细讲解,推荐:https://www.cnblogs.com/wzsblogs/p/4671559.html. 采用同 ...

  10. python框架django-web层

    1.demo 命令行:django-admin startproject HelloWorld 命令执行成功后会根据模版生产一个django项目 然后通过 命令:python3 manage.py r ...