我知道PHP CLI通常被用来避免超时限制,主要是因为它不使用Apache线程/进程。
但是否有方法可以明确设置一些脚本的max_execution_time,以便我不想让它们拥有“无限时间”的自由,只想要控制这些脚本?
如果你认为这个问题最好在superuser.com上回答,并且有权限移动它,请移动。
编辑:我已经进行了一些谷歌搜索,找到了正确的参数:
php -d max_execution_time=5 script.php
我知道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
php.ini
中,它指出:“此指令对于 CLI SAPI 硬编码为 0”,这意味着它无法从无超时切换。 - Andrew Brownset_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
}
exec()
快速修复解决了我的问题。谢谢! - mFlorin
timeout 5 cliprocess.php
php.ini
、php-cli.ini
等)中设置max_execution_time
,以便在运行CLI脚本时更改其影响。此行为在此处描述:http://php.net/manual/en/features.commandline.differences.php - jkulakphp -r 'ini_set("max_execution_time", 0);'
- Tobias Gaertner