Skip to content

优雅的停止PHP脚本

当我们在用PHP脚本处理消息队列时,经常会有这样的场景

php

while(true) {
    // 业务代码 step:1 ...
    // 业务代码 step:2 ...
    // 业务代码 step:n ...
}

当我们结束进程,此时业务代码可能执行到任意步骤就停止了 我们期望的是接受到停止的信号,当业务代码执行到n步的时候,再停止程序 这个场景下,我们就可以用 pcntl_signal 来处理信号,直接上代码

php

function signalHandler($signal) {
    global $running;
    if (in_array($signal, [SIGINT, SIGTERM])) {
        echo "$signal received. Stopping gracefully...\n";
        $running = false;
    }
}

pcntl_signal(SIGINT, 'signalHandler');
pcntl_signal(SIGTERM, 'signalHandler');

$running = true;

while($running) {
    // 业务代码 step:1 ...
    // 业务代码 step:2 ...
    // 业务代码 step:n ...
    // 处理信号
    pcntl_signal_dispatch(); 
}