我知道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只影响脚本本身的执行时间。在确定脚本运行的最长时间
我也有类似的问题。但在我的例子中,远程数据库调用花费了大量时间,我希望在一定时间后终止脚本。正如在其他回答中所指出的,外部调用(或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函数