问题 当脚本从命令行中被杀死时,PHP的register_shutdown_function会被触发?


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

我努力了 register_shutdown_function(),但是当脚本被杀死时似乎没有被调用,但是当脚本正常结束时会被调用。

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


6629
2017-10-11 20:42


起源

“自动杀死”是什么意思:系统停止进程的时间限制,或PHP停止脚本? - Pekka 웃
我有另一个cron实例,可以杀死在x秒后在后台运行的crons。 - Wei
也许它更简单然后登录杀死的cron脚本... - giraff


答案:


根据a 在手册中评论 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');  
 ?>

这种方式当过程收到一个   这些信号,它正常退出,   并调用shutdown函数。 ...(缩写以节省空间,阅读全文)

如果这太麻烦了,我会考虑通过设置时间限制来从PHP中进行超时。达到限制将引发致命错误,并且应该正常调用关闭函数。


14
2017-10-11 20:50



这很酷,但我认为我不能在生产机器上重新编译php。 - Wei
@Wei为什么不依赖PHP的时间限制呢? (如果它在CLI上工作 - 我从未尝试过,也有一些评论 这里 建议硬编码为0 - 你必须尝试) - Pekka 웃
@Wei也, pcntl 可能已在您的PHP版本中启用,请检查它 - Pekka 웃
时间限制仅适用于其中一个kill参数。我还有其他参数,包括内存使用和CPU使用情况。 - Wei
请注意,从PHP 4.3开始(每个人都应该至少使用),您需要启动此答案示例代码 declare(ticks = 1); 对于 pcntl_signal 上班。文档: php.net/pcntl_signal - georgiecasey