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

Wei*_*Wei 11 php shutdown-hook

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

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

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

Pek*_*ica 14

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

当使用CLI(可能没有CLI的命令行 - 我没有测试它)时,如果进程获得SIGINT或SIGTERM,则不会调用shutdown函数.只有PHP的自然出口才会调用shutdown函数.要解决此问题,请编译命令行解释器 --enable-pcntl并添加以下代码:

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

这样,当进程收到其中一个信号时,它会正常退出,并且会调用shutdown函数....(缩写以节省空间,阅读全文)

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

  • 请注意,从PHP 4.3开始(每个人都应该至少使用),你需要用`declare(ticks = 1);`for` pcntl_signal`来启动这个答案示例代码.docs:http://php.net/pcntl_signal (3认同)