当通过命令行(使用Ctrl+c)或使用kill命令终止cron进程时,是否有可能调用函数?
我尝试过register_shutdown_function()
,但在脚本被杀死时似乎没有被调用,但在脚本正常结束时会被调用。
我正在尝试在cron实例自动终止(即运行时间过长)时将结果记录到文件并更新数据库值。
当通过命令行(使用Ctrl+c)或使用kill命令终止cron进程时,是否有可能调用函数?
我尝试过register_shutdown_function()
,但在脚本被杀死时似乎没有被调用,但在脚本正常结束时会被调用。
我正在尝试在cron实例自动终止(即运行时间过长)时将结果记录到文件并更新数据库值。
根据在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内部设置一个时间限制来完成计时。达到限制后将抛出致命错误,然后关闭函数应该会被正常调用。
pcntl
可能已经在你的 PHP 版本中启用了,请检查一下。 - Pekkadeclare(ticks = 1);
才能让pcntl_signal
正常工作。文档链接:http://php.net/pcntl_signal - georgiecasey