swoole如何平滑重启

广告:宝塔Linux面板高效运维的服务器管理软件 点击【 https://www.bt.cn/p/uNLv1L 】立即购买

swoole如何平滑重启

swoole 平滑重启

在swoole中,我们可以向主进程发送各种不同的信号,主进程根据接收到的信号类型做出不同的处理。比如下面这几个

SIGTERM,一种优雅的终止信号,会待进程执行完当前程序之后中断,而不是直接干掉进程 (推荐学习: swoole视频教程)

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

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

如果我们要实现重启server,只需要向主进程发送SIGUSR1信号就好了。

平滑重启的原理是当主进程收到SIGUSR1信号时,主进程就会向一个子进程发送安全退出的信号,所谓的安全退出的意思是主进程并不会直接把Worker进程杀死,而是等这个子进程处理完手上的工作之后,再让其光荣的“退休”,最后再拉起新的子进程(重新载入新的PHP程序代码)。

然后再向其他子进程发送“退休”命令,就这样一个接一个的重启所有的子进程。

我们注意到,平滑重启实际上就是让旧的子进程逐个退出并重新创建新的进程。为了在平滑重启时不影响到用户,这就要求进程中不要保存用户相关的状态信息,即业务进程最好是无状态的,避免由于进程退出导致信息丢失。

感觉很美好的样子,凡是重启只要简单的向主进程发送信号就完事了呗。

理想很丰满,现实并非如此。

在swoole中,重启只能针对Worker进程启动之后载入的文件才有效!什么意思呢,就是说只有在onWorkerStart回调之后加载的文件,重启才有意义。在Worker进程启动之前就已经加载到内存中的文件,如果想让它重新生效,还是只能乖乖的关闭server再重启。

说了这么多,我们写个例子看看到底怎么样向主进程发送SIGUSR1信号以便有效重启Worker进程。

首先我们创建一个Test类,用于处理onReceive回调的数据,为什么要把onReceive回调的业务拿出来单独写,看完例子你就明白了。

<?phpclass Test{    public function run($data)    {        echo $data;    }}
登录后复制

在Test::run方法中,我们第一步仅仅是echo输出swoole_server接收到的数据。

当前目录下我们创建一个swoole_server的类NoReload.php

<?phprequire_once("Test.php");class NoReload{    private $_serv;    private $_test;    /**     * init     */    public function __construct()    {        $this->_serv = new Swoole\Server("127.0.0.1", 9501);        $this->_serv->set([            'worker_num' => 1,        ]);        $this->_serv->on('Receive', [$this, 'onReceive']);        $this->_test = new Test;    }    /**     * start server     */    public function start()    {        $this->_serv->start();    }    public function onReceive($serv, $fd, $fromId, $data)    {        $this->_test->run($data);    }}$noReload = new NoReload;$noReload->start();
登录后复制

特别提醒:我们在初始化swoole_server的时候的写法是命名空间的写法

new Swoole\Server
登录后复制

该种风格的写法等同于下划线写法 ,swoole对这两种风格的写法都支持

new swoole_server
登录后复制

此外我们看下server的代码逻辑:类定义之前require_once了Test.php,初始化的时候设置了一个Worker进程,注册了NoReload::onReceive方法为swoole_server的onReceive回调,在onReceive回调内接收到的数据传递给了Test::run方法处理。

以上就是swoole如何平滑重启的详细内容,更多请关注9543建站博客其它相关文章!

广告:SSL证书一年128.66元起,点击购买~~~

9543建站博客
一个专注于网站开发、微信开发的技术类纯净博客。
作者头像
admin创始人

肥猫,知名SEO博客站长,14年SEO经验。

上一篇:php求二维数组最大最小值
下一篇:详细介绍thinkphp5如何设置表前缀

发表评论

关闭广告
关闭广告