在PHP CLI中设置max_execution_time

时间:2011-05-03 19:55:49

标签: linux command-line-interface php

我知道通常使用PHP CLI是因为没有时间限制和主要因为它没有使用Apache线程/进程。

但有没有办法如何为某些脚本显式设置max_execution_time,我不想拥有“无限时间”的自由,只是想让这些脚本受到控制?

如果您认为这个问题可以在superuser.com上得到更好的解答并且有权移动它,那就去做吧。 :)

编辑:我一直在谷歌搜索并找到正确的参数:

php -d max_execution_time=5 script.php

4 个答案:

答案 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功能。