如何设置 PHP 的 CLI 组件的最大执行时间?我有一个 CLI 脚本陷入了无限循环,我不确定如何在不重新启动的情况下终止它。我使用 quicksilver 来启动它,因此我无法在命令行中按 control+c。我尝试运行ps -A
(显示所有进程),但 php 没有出现在该列表中,所以也许它自己超时了 - 但您如何手动设置时间限制?
我试图找到有关应该在哪里设置的信息max_execution_time
,我习惯于为与 apache 一起运行的 PHP 版本设置它,但我不知道在哪里为所在的 PHP 版本设置它/usr/bin
。
我确实看到了下面的引用,它似乎是准确的(见下面的截图),但无限的执行时间似乎不是一个好主意。
请记住,对于 CLI SAPI,max_execution_time 被硬编码为 0。因此它似乎可以通过 ini_set 或 set_time_limit 进行更改,但实际上并非如此。我发现对这一奇怪决定的唯一引用是在 bugtracker 深处(http://bugs.php.net/37306)以及 php.ini 中的“max_execution_time”指令的注释。(通过http://php.net/manual/en/function.set-time-limit.php)
ini_set('max_execution_time')
没有效果。我也尝试了同样的事情,得到了同样的结果set_time_limit(7)
。
更新
因此似乎有三种方法可以实现这一点:
在脚本中:
set_time_limit(10); // 这样 ini_set('max_execution_time', 10); // 或者这样
或者在调用脚本时:
php -d max_execution_time=5 脚本.php
回答我关于 php.ini 文件从哪里加载的问题,/etc/php.ini
如果存在的话,就是从哪里加载。该文件还需要由运行 php 脚本的用户读取,因此如果它是由 root 创建的,并且用户无法“读取”它,则意味着 php 可能也无法“读取”它。
但是,看起来任何设置的 max_execution_time/etc/php.ini
实际上都不会影响 CLI 脚本 - 即使文件被正确加载(用来phpinfo()
找出答案) - 所以您必须使用上面提到的其他方法之一。
关于使用睡眠循环来测试这一点,我了解到它不起作用。
set_time_limit() 函数和配置指令 max_execution_time 仅影响脚本本身的执行时间。在确定脚本运行的最大时间时,不包括在脚本执行之外发生的任何活动所花费的时间,例如使用 system() 的系统调用、sleep() 函数、数据库查询等
查看 Stack Overflow 上提出的一个非常类似的问题:https://stackoverflow.com/questions/5874950/set-max-execution-time-in-php-cli
答案1
在 PHP 代码的顶部,
ini_set('max_execution_time',300);
或者
set_time_limit(300);
您确定它会进入循环吗?如果执行线程已超出 PHP 的范围并进入扩展程序(或其他地方),则不会产生任何效果。
更好的解决方案是将脚本包装在看门狗中
答案2
在您的测试脚本中,您曾经sleep(5)
测试长时间运行的执行时间,但这不是一个有效的测试。
这最大执行时间的文档说这个:
最大执行时间不受系统调用、流操作等的影响。
和set_time_limit() 的文档说这个:
在确定脚本运行的最大时间时,不包括在脚本执行之外发生的任何活动所花费的时间,例如使用 system() 的系统调用、流操作、数据库查询等。在 Windows 上,测量的时间是真实的,因此情况并非如此。
如果您避免使用 sleep 系统调用,则set_time_limit(5);
在 CLI 脚本中应该可以正常工作。这是一个应在 5 秒后退出的测试脚本:
<?php
set_time_limit(5);
$start = time();
$last = 0;
for ($i=0;$i>=0;$i++) {
if ($i%10000==0) {
$took = time()-$start;
if ($took!=$last) {
echo "taken {$took} s so far...\n";
$last=$took;
}
}
}
php timeout_test.php
taken 1 s so far...
taken 2 s so far...
taken 3 s so far...
taken 4 s so far...
taken 5 s so far...
PHP Fatal error: Maximum execution time of 5 seconds exceeded in /home/tom/MailChap/timeout_test.php on line 8
PHP Stack trace:
PHP 1. {main}() /home/tom/MailChap/timeout_test.php:0