我知道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启动。 这是不太可能的,但是如果你使用这种方法,你应该考虑这种可能性。