在PHP CLI中设置max_execution_time

62

我知道PHP CLI通常被用来避免超时限制,主要是因为它不使用Apache线程/进程。

但是否有方法可以明确设置一些脚本的max_execution_time,以便我不想让它们拥有“无限时间”的自由,只想要控制这些脚本?

如果你认为这个问题最好在superuser.com上回答,并且有权限移动它,请移动。

编辑:我已经进行了一些谷歌搜索,找到了正确的参数:

php -d max_execution_time=5 script.php

1
阅读所有答案后,我只想补充一点,即无法在任何ini文件(如php.iniphp-cli.ini等)中设置max_execution_time,以便在运行CLI脚本时更改其影响。此行为在此处描述:http://php.net/manual/en/features.commandline.differences.php - jkulak
1
如果您想在以后执行其他脚本时也启用它,您还可以使用以下命令:php -r 'ini_set("max_execution_time", 0);' - Tobias Gaertner
5个回答

45

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

这个答案还有效吗?我尝试了同样的方法,但无法让它超时。在 php.ini 中,它指出:“此指令对于 CLI SAPI 硬编码为 0”,这意味着它无法从无超时切换。 - Andrew Brown
@AndrewBrown 是的,它仍然有效。只是不要使用 sleep() 函数进行测试。 - besciualex
但是我该如何在控制台中编写ini_set()呢?它会抛出一个错误。 - Čamo

29

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()函数、数据库查询等)都不包括在内,当确定脚本运行的最长时间时。


13
你无法使用“sleep”函数进行测试。请改用“for(;;) ;”来代替。 - Jon
你说得对...它有效,我改变了我的答案,因为它是误导性的。 - stivlo
2
你有办法停止脚本吗,即使它运行外部命令(sleep、script、queries等)? - neoteknic

4

我有一个类似的问题。但在我的情况下,远程数据库调用需要很长时间,我想在一定时间后终止脚本。如其他答案所述,外部调用(或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
}

请注意,您的脚本可能会正常结束,然后使用相同的pid启动一个新的不同脚本,并且这个kill命令将终止它。虽然这种情况不太可能发生,但如果您使用这种方法,应该考虑这种可能性。

我会使用-15(SIGTERM)来使进程正确终止。 - Svetoslav Marinov
尝试了很多其他方法,什么都不起作用,使用exec()快速修复解决了我的问题。谢谢! - mFlorin

1
您可以使用“timeout”Linux命令:

timeout 5 cliprocess.php

很好的技巧,除非自 PHP 5.4.0 起 safe_mode 无法关闭。 - Marco

0

是的,正如@Jon所演示的那样。 - stivlo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接