PHP的register_shutdown_function如何在命令行关闭脚本时触发?

13

当通过命令行(使用Ctrl+c)或使用kill命令终止cron进程时,是否有可能调用函数?

我尝试过register_shutdown_function(),但在脚本被杀死时似乎没有被调用,但在脚本正常结束时会被调用。

我正在尝试在cron实例自动终止(即运行时间过长)时将结果记录到文件并更新数据库值。


“被自动杀死”是什么意思:系统的时间限制停止了进程,还是PHP停止了脚本? - Pekka
我有另一个 Cron 实例,它会在 x 秒后杀死在后台运行的 Cron。 - Wei
也许更简单的方法是在cron脚本中记录杀死进程的操作... - giraff
1个回答

15

根据在register_shutdown_function()手册中的一个评论,可以通过以下方式完成:

当使用CLI(也许是没有CLI的命令行-我没有测试过)时,如果进程收到SIGINT或SIGTERM,关闭函数将不会被调用。只有PHP的自然退出才会调用关闭函数。为了克服这个问题,请使用--enable-pcntl编译命令行解释器并添加以下代码:

 <?php
 declare(ticks = 1); // enable signal handling
 function sigint()  { 
    exit;  
 }  
 pcntl_signal(SIGINT, 'sigint');  
 pcntl_signal(SIGTERM, 'sigint');  
 ?>

如果那样太麻烦,那么可以考虑在PHP内部设置一个时间限制来完成计时。达到限制后将抛出致命错误,然后关闭函数应该会被正常调用。


很酷,但我不认为我能在生产机器上重新编译php。 - Wei
@Wei 为什么不依赖于 PHP 的时间限制呢?(只要它在 CLI 上工作 - 我从未尝试过,一些评论在这里表明它是硬编码为0 - 你需要尝试一下) - Pekka
@Wei 同时,pcntl 可能已经在你的 PHP 版本中启用了,请检查一下。 - Pekka
3
请注意,从PHP 4.3开始(至少应该使用此版本),您需要在这个答案的示例代码中加入declare(ticks = 1);才能让pcntl_signal正常工作。文档链接:http://php.net/pcntl_signal - georgiecasey
@georgiecasey:我猜你在上面的评论中想说的是5.3! - halfer
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接