目标:
在后台进程中 写一个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); // 模拟业务逻辑执行
}
网友评论