如何实现一个优雅的 While (true)循环

2020-03-20  本文已影响0人  骑蚂蚁上高速_jun

目标:
在后台进程中 写一个while(true) 循环, 要求该循环实现
优雅的停止(不影响业务) 和 重新加载业务代码(不影响现有业务)。

实现原理:
通过 linux服务器的信号处理,程序本身通过接收外部信号而对软件代码层的一种机制实现。

通过 php 实现:

$run = true; // 循环的标识
/**
 * 安装 SIGUSR1 信号监听器
 */
pcntl_signal(SIGUSR1, function ($signo) use(&$run){

    if($signo == SIGUSR1){
        echo "重载业务文件 require | include... \n";
    }

});

/**
 * 安装 SIGTERM 信号监听器
 */
pcntl_signal(SIGTERM , function ($signo) use(&$run){

    if ($signo == SIGTERM){
        echo "服务器优雅停止 \n";
        $run = false;
    }

});

while($run){
    /**
     * 异步等待信号并 触发安装的信号
     * 该函数有两个功能,
     * 1.等待接收信号;2.异步触发信号
     * 执行顺序, 先1后2
     * 备注说明: 只有在实现第一步接收到信号时,才能触发对应的信号
     */
    pcntl_signal_dispatch();// dengda
    sleep(20); // 模拟业务逻辑执行

}
上一篇 下一篇

猜你喜欢

热点阅读