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(); 

开启服务器后

查看进程

然后查看pid_file里的mast进程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的了。

然后执行退出

查看进程确实不见了

原文地址:https://www.cnblogs.com/gavinjunftd/p/9520144.html

时间: 2024-10-19 21:55:43

Swoole 理解manager进程和worker进程的启动顺序,以及演示如何停止或者重启服务端。的相关文章

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

进程池与线程池.协程.协程实现TCP服务端并发.IO模型 一.进程池与线程池 1.线程池 ''' 开进程开线程都需要消耗资源,只不过两者比较的情况下线程消耗的资源比较少 在计算机能够承受范围内最大限度的利用计算机 什么是池? 在保证计算机硬件安全的情况下最大限度的利用计算机 池其实是降低了程序的运行效率,但是保证了计算机硬件的安全 (硬件的发展跟不上软件的速度) ''' from concurrent.futures import ThreadPoolExecutor import time p

master进程和worker进程

master进程为主进程,该进程会创建Manager进程和Reactor线程等工作进/线程 Reactor线程实际运行epoll实例,用于接受客户端的链接和发来的请求 Manager进程是管理进程,该进程是为了创建管理所有的worker进程和TaskWorker进程 worker进程是工作进程,所有的业务逻辑都在该进程中进行,当Reactor线程接收到来自客户端的数据后,会将数据打包通过管道发送给某个Worker进程 Nginx的进程数设定一般等于核数,,高流量并发场合也可以考虑将进程数提高至

关于nginx的master进程可worker进程的概念

nginx的master和worker进程之间的关系,就像是坐台的"***"与"老鸨"之间的关系. 假如说一个妓院有多名***,而管理每个***的老鸨只有一个,其中老鸨负责对外招揽业务,而***负责干活(处理业务),如果一个***接待不完这些客人,老鸨会把随后的客人交给其他的***去接待. 在这里,老鸨就属于master进程,客户端所有的请求都是由master来接收,***呢,就相当于woker进程,(真正处理客户端请求的是下面这些woker进程).

nginx worker进程循环

worker进程启动后,其首先会初始化自身运行所需要的环境,然后会进入一个循环,在该循环中不断检查是否有需要执行的事件,然后处理事件.在这个过程中,worker进程也是需要与master进程交互的,更有甚者,worker进程作为一个子进程,也是可以接收命令行指令(比如kill等)以进行相应逻辑的处理的.那么worker进程是如何与master或者命令行指令进行交互的呢?本文首先会对worker进程与master进程交互方式,以及worker进程如何处理命令行指令的流程进行讲解,然后会从源码上对w

nginx源码分析--master和worker进程模型

一.Nginx整体架构 正常执行中的nginx会有多个进程,最基本的有master process(监控进程,也叫做主进程)和woker process(工作进程),还可能有cache相关进程. 一个较为完整的整体框架结构如图所示: 二.核心进程模型 启动nginx的主进程将充当监控进程,而由主进程fork()出来的子进程则充当工作进程. nginx也可以单进程模型执行,在这种进程模型下,主进程就是工作进程,没有监控进程. Nginx的核心进程模型框图如下: master进程 监控进程充当整个进

Nginx学习——进程模型(worker进程)

进程模型 worker进程 master进程模型核心函数ngx_master_process_cycle()中调用了创建子进程函数ngx_start_worker_processes(),该函数源码如下 static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type) { ngx_int_t i; ngx_channel_t ch; ngx_log_error(NGX_LOG_NOTIC

&lt;spark&gt; error:启动spark后查看进程,进程中master和worker进程冲突

启动hadoop再启动spark后jps,发现master进程和worker进程同时存在,调试了半天配置文件. 测试发现,当我关闭hadoop后 worker进程还是存在, 但是,当我再关闭spark之后再jps,发现worker进程依旧存在 于是想起了在~/spark/conf/slaves 中配置的slave1 slave2 上面还有个localhost,直接删去localhost,然后kill -s 9  worker进程. 初次测试这样解决了error,但是不知道是不是暂时的,如若有问题

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

Linux中想杀死fcitx进程,然后再重启它. [email protected]:/home/zhangbin# ps -e | grep 'fcitx' 3405 ?        00:00:00 fcitx <defunct> 3415 ?        00:00:02 fcitx   不显示标题 [email protected]:/home/zhangbin# ps -h Warning: bad ps syntax, perhaps a bogus '-'? See http

大数据技术之_16_Scala学习_11_客户信息管理系统+并发编程模型 Akka+Akka 网络编程-小黄鸡客服案例+Akka 网络编程-Spark Master Worker 进程通讯项目

第十五章 客户信息管理系统15.1 项目的开发流程15.2 项目的需求分析15.3 项目的界面15.4 项目的设计-程序框架图15.5 项目的功能实现15.5.1 完成 Customer 类15.5.2 完成显示主菜单和退出软件功能15.5.3 完成显示客户列表的功能15.5.4 完成添加客户的功能15.5.5 完成删除客户的功能15.5.6 完善退出确认功能15.5.7 完善删除确认功能15.5.8 完成修改客户的功能第十六章 并发编程模型 Akka16.1 Akka 的介绍16.2 Acto