守护进程、信号和平滑重启[通俗易懂]

守护进程、信号和平滑重启

大家好,又见面了,我是全栈君。

守护进程

swoole官方也为我们提供了配置选项daemonize(默认未启用),若要开启守护进程,daemonize设置为true即可,这样就可以不受终端控制,在后台运行。
配置为守护进程后,所有的标准输出将失效,如果要调试,可以配置log_file,所有的标准输出统统记载到该文件中。

平滑重启

swoole是常驻内存的,若想让修改后的代码生效,就必须Ctrl+C,然后再重启server。对于守护进程化的server呢?则需kill掉后,再重启。
事实上,swoole进程刚好处理了一半的数据,此时被kill,就特别容易出现问题。
swoole为我们提供了平滑重启机制,我们只需要向swoole_server的主进程发送特定的信号,即可完成对server的重启。

平滑重启包含的信号

  1. SIGTERM,一种优雅的终止信号,会待进程执行完当前程序之后中断,而不是直接干掉进程

  2. SIGUSR1,将平稳的重启所有的Worker进程

  3. SIGUSR2,将平稳的重启所有的Task进程

pstree | grep server_process #找出主进程
kill -TERM 55559 #优雅终止主进程
kill -USR1 55559 #热重启worker进程,onWorkerStart回调之后加载的文件,重启才有意义
kill -USR2 55559 #热重启task进程,onTask回调之后加载的文件,重启才有意义

要加载的文件 (Person.php)

~~~
class Person
{
    public $name = '';
    public function __toString(){
        return "~~___".$this->name."___";
    }
}
~~~

server 热重启代码

~~~
$serv = new swoole_server('127.0.0.1', 9501);

// 配置为守护进程方式,以及log调试日志
$serv->set([
    'worker_num' => 1,
    'daemonize' => true,
    'log_file' => __DIR__ . '/server.log',
]);

$serv->on('Connect', function ($serv, $fd) {
    echo "new client connected." . PHP_EOL;
});

$serv->on('Receive', function ($serv, $fd, $fromId, $data) {
    echo "worker received data: {$data} from ". PHP_EOL;
});

$serv->on('WorkerStart', function ($serv, $workerId) {    
    //onWorkerStart之后加载的文件,如果该文件有改动,则可以热重启
    require_once ('Person.php');
    $p = new Person();
    $p->name = 'wangkun';
    echo $p;
});

$serv->start();
~~~

守护进程、信号和平滑重启[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111877.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月13日 下午5:00
下一篇 2022年2月13日 下午5:00


相关推荐

  • 使用php实现单点登录实例详解

    使用php实现单点登录实例详解

    2021年10月27日
    40
  • C#彩色扭曲验证码

    C#彩色扭曲验证码该验证码生成类集合了网上大部分的验证码生成类的精华,并多次改进,现在已经形成了可在生产环节中使用的验证码。该验证码加入了背景噪点,背景噪点曲线和直线,背景噪点文字以及扭曲,调暗,模糊等。完全可以实现防识别。按照国际惯例先贴张效果图吧:#region验证码生成类//////验证码生成类///

    2022年7月21日
    18
  • golang 软件激活码-激活码分享

    (golang 软件激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~F…

    2022年3月28日
    361
  • java keypress事件_java keypress

    java keypress事件_java keypressokButton addSelection newSelection publicvoidwi finalSelecti 点击 OK 事件 booleantf true 记录用户输入是否正确 if text getText leng okButton addSelection newSelecti

    2026年3月20日
    2
  • 协方差公式推导_二维正态分布cov协方差公式

    协方差公式推导_二维正态分布cov协方差公式协方差公式推导cov(X,Y)=∑ni=1(Xi−X¯)(Yi−Y¯)n=E[(X−E[X])(Y−E[Y])]cov(X,Y)=\frac{\sum_{i=1}^{n}(X_i-\bar{X})(Y_i-\bar{Y})}{n}=E[(X-E[X])(Y-E[Y])]=E[XY−E[X]Y−XE[Y]+E[X]E[Y]]=E[XY-E[X]Y-XE[Y]+E[X]E[Y]]因为均值

    2025年8月18日
    4
  • fillna函数用法_fill…with

    fillna函数用法_fill…withinplace参数的取值:True、FalseTrue:直接修改原对象False:创建一个副本,修改副本,原对象不变(缺省默认)method参数的取值:{‘pad’,‘ffill’,‘backfill’,‘bfill’,None},defaultNonepad/ffill:用前一个非缺失值去填充该缺失值backfill/bfill:用下一个非缺失值填充该缺失…

    2022年8月12日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号