我希望在PHP脚本中遇到异常时,能够执行一些最终代码。比如说我有一个PHP脚本:
while(true) {
echo 'loop';
sleep(1);
}
如果我使用$ php script.php
执行脚本,它会在给定的执行时间内运行。
现在我想在脚本被中止后执行一些最终代码。所以如果我
- 按下
Ctrl+C
- 执行时间结束
在这些情况下是否有可能进行一些清理工作?
我尝试过使用pcntl_signal
,但没有成功。还使用了register_shutdown_function
,但只有在脚本成功结束时才会调用该函数。
更新
我发现(感谢rch的链接),可以通过以下方式“捕捉”事件:
pcntl_signal(SIGTERM, $restartMyself); // kill
pcntl_signal(SIGHUP, $restartMyself); // kill -s HUP or kill -1
pcntl_signal(SIGINT, $restartMyself); // Ctrl-C
但是如果我使用以下代码扩展我的程序:
$cleanUp = function() {
echo 'clean up';
exit;
};
pcntl_signal(SIGINT, $cleanUp);
脚本保持执行,但如果我按下Ctrl+C,则不会遵循$cleanUp闭包中的代码。
ticks = 1
和pcntl_signal一起的方法中错过的东西... - TiMESPLiNTERexit()
,但想进行其他处理,则建议在信号处理程序中设置一个标志,并在主程序循环中检查它,然后根据情况进行处理(或者使用pcntl_signal_dispatch()
而不是declare(ticks=1)
)。 您可以阅读有关终止信号的更多信息。 - axiacpcntl_signal_dispatch
而不是ticks = 1
,我应该在哪里调用它?在我的循环中的某个地方吗?然后脚本执行到分派调用,然后调用由pcntl_signal
函数定义的回调,对吗? - TiMESPLiNTERPHP
安装信号处理程序并将接收到的信号放入队列中。函数pcntl_signal_dispatch()
从队列中获取信号,并使用pcntl_signal()
调用您为其提供的处理程序。它在调用时运行(每个循环一次或者在适合您代码的任何时候)。语句declare(ticks=1)
安装了一个tick 函数
,该函数调用pcntl_signal_dispatch()
。由于ticks=1
,它运行得更频繁,脚本响应更快(但运行速度稍慢)。 - axiac