在PHP CLI中设置max_execution_time

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

但有什么办法如何明确地设置一些脚本的max_execution_time我不想有“无限的时间”的自由,只是想保持这些脚本在控制之下?

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

编辑 :我一直在谷歌search了一下,发现正确的参数:

php -d max_execution_time=5 script.php 

该文档说,在命令行模式下运行时,默认值为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 

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 

最初我尝试了睡眠()和时间限制不适用。 正如@Jon所建议的,使用真正的计算,就像无限循环一样。

我在sleep() PHP页面中发现了这个有趣的评论:

注意:set_time_limit()函数和配置指令max_execution_time仅影响脚本本身的执行时间。 在确定脚本运行的最长时间时, 不包括使用system(),sleep()函数,数据库查询等在脚本执行之外发生的活动,例如系统调用

使用set_time_limit函数。

我有一个类似的问题。 但在我的情况下,我有远程数据库调用需要很长时间,我想在一段时间后终止脚本。 正如在其他答案中指出的那样,外部呼叫(或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启动。 这是不太可能的,但是如果你使用这种方法,你应该考虑这种可能性。