在PHP命令行中设置max_execution_time


Set max_execution_time in PHP CLI

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

但是有任何方法如何显式设置max_execution_time为一些脚本,我不想有"无限时间"的自由,只是想保持这些脚本在控制之下?

如果你认为这个问题在superuser.com上可以得到更好的回答,并且被允许移动它,那么就去做吧。:)

编辑:我已经搜索了一下,找到了正确的参数:

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

最初我尝试使用sleep()和时间限制不适用。正如@Jon所建议的,使用一个真实的计算,比如无限循环。

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

注意:set_time_limit()函数和配置指令max_execution_time只影响脚本本身的执行时间。在确定脚本运行的最长时间

时,不包括在脚本执行之外发生的活动(如使用system()的系统调用、sleep()函数、数据库查询等)上花费的时间

我也有类似的问题。但在我的例子中,远程数据库调用花费了大量时间,我希望在一定时间后终止脚本。正如在其他回答中所指出的,外部调用(或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启动。这是不太可能的,但是如果您使用这种方法,您应该考虑这种可能性。

您也可以使用" timeout " linux命令:

timeout 5 cliprocess.php

使用set_time_limit函数