我知道通常使用PHP CLI是因为没有时间限制和主要因为它没有使用Apache线程/进程。
但有没有办法如何为某些脚本显式设置max_execution_time,我不想拥有“无限时间”的自由,只是想让这些脚本受到控制?
如果您认为这个问题可以在superuser.com上得到更好的解答并且有权移动它,那就去做吧。 :)
编辑:我一直在谷歌搜索并找到正确的参数:
php -d max_execution_time=5 script.php
答案 0 :(得分:34)
documentation表示在命令行模式下运行时,默认值为0(无限制)。它并没有说你不能覆盖它:
set_time_limit(10); // this way
ini_set('max_execution_time', 10); // or this way
编辑:我自己尝试过,它按预期工作。
F:\dev\www>c:php -f index.php
PHP Fatal error: Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3
Fatal error: Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3
答案 1 :(得分:21)
set_time_limit()在CLI脚本中有效。
<?php
set_time_limit(1); //in seconds
for (;;);
?>
一秒钟后返回并显示以下错误消息:
PHP Fatal error: Maximum execution time of 1 second exceeded in \
/home/stivlo/test.php on line 4
最初我尝试使用sleep()并且没有应用时间限制。正如@Jon建议的那样,使用真实的计算,就像无限循环一样。
我在sleep() PHP页面中找到了这个有趣的评论:
注意:set_time_limit()函数和配置指令max_execution_time仅影响脚本本身的执行时间。 在确定脚本执行之外发生的活动的任何时间,例如使用system()的系统调用,sleep()函数,数据库查询等都不包括,当确定最大时间时脚本一直在运行
答案 2 :(得分:1)
我有类似的问题。但在我的情况下,我有远程数据库调用需要很长时间,我想在一段时间后终止脚本。如其他答案中所述,外部调用(或sleep()
)不会计入配置的超时设置。
所以我的方法是找出脚本pid,然后在睡眠后设置kill -9
命令。这是一个基本的例子:
$cmd = "(sleep 10 && kill -9 ".getmypid().") > /dev/null &";
exec($cmd); //issue a command to force kill this process in 10 seconds
$i=0;
while(1){
echo $i++."\n";
sleep(1); //simulating a query
}
请注意,您的脚本可能会很好地结束,并且一个新的,不同的脚本会启动与此kill命令将终止的相同pid。这是不太可能的,但如果你使用这种方法,你应该考虑这种可能性。
答案 3 :(得分:0)
使用set_time_limit功能。