如何设置 PHP 的 CLI 组件的最大执行时间?

如何设置 PHP 的 CLI 组件的最大执行时间?

如何设置 PHP 的 CLI 组件的最大执行时间?我有一个 CLI 脚本陷入了无限循环,我不确定如何在不重新启动的情况下终止它。我使用 quicksilver 来启动它,因此我无法在命令行中按 control+c。我尝试运行ps -A(显示所有进程),但 php 没有出现在该列表中,所以也许它自己超时了 - 但您如何手动设置时间限制?

我试图找到有关应该在哪里设置的信息max_execution_time,我习惯于为与 apache 一起运行的 PHP 版本设置它,但我不知道在哪里为所在的 PHP 版本设置它/usr/bin

我确实看到了下面的引用,它似乎是准确的(见下面的截图),但无限的执行时间似乎不是一个好主意。

请记住,对于 CLI SAPI,max_execution_time 被硬编码为 0。因此它似乎可以通过 ini_set 或 set_time_limit 进行更改,但实际上并非如此。我发现对这一奇怪决定的唯一引用是在 bugtracker 深处(http://bugs.php.net/37306)以及 php.ini 中的“max_execution_time”指令的注释。(通过http://php.net/manual/en/function.set-time-limit.php

ini_set('max_execution_time')没有效果。我也尝试了同样的事情,得到了同样的结果set_time_limit(7)

更新

因此似乎有三种方法可以实现这一点:

在脚本中:

set_time_limit(10); // 这样
ini_set('max_execution_time', 10); // 或者这样

或者在调用脚本时:

php -d max_execution_time=5 脚本.php

回答我关于 php.ini 文件从哪里加载的问题,/etc/php.ini如果存在的话,就是从哪里加载。该文件还需要由运行 php 脚本的用户读取,因此如果它是由 root 创建的,并且用户无法“读取”它,则意味着 php 可能也无法“读取”它。

但是,看起来任何设置的 max_execution_time/etc/php.ini实际上都不会影响 CLI 脚本 - 即使文件被正确加载(用来phpinfo()找出答案) - 所以您必须使用上面提到的其他方法之一。

关于使用睡眠循环来测试这一点,我了解到它不起作用。

set_time_limit() 函数和配置指令 max_execution_time 仅影响脚本本身的执行时间。在确定脚本运行的最大时间时,不包括在脚本执行之外发生的任何活动所花费的时间,例如使用 system() 的系统调用、sleep() 函数、数据库查询等

查看 Stack Overflow 上提出的一个非常类似的问题:https://stackoverflow.com/questions/5874950/set-max-execution-time-in-php-cli

答案1

在 PHP 代码的顶部,

ini_set('max_execution_time',300);

或者

set_time_limit(300);

您确定它会进入循环吗?如果执行线程已超出 PHP 的范围并进入扩展程序(或其他地方),则不会产生任何效果。

更好的解决方案是将脚本包装在看门狗中

答案2

在您的测试脚本中,您曾经sleep(5)测试长时间运行的执行时间,但这不是一个有效的测试。

最大执行时间的文档说这个:

最大执行时间不受系统调用、流操作等的影响。

set_time_limit() 的文档说这个:

在确定脚本运行的最大时间时,不包括在脚本执行之外发生的任何活动所花费的时间,例如使用 system() 的系统调用、流操作、数据库查询等。在 Windows 上,测量的时间是真实的,因此情况并非如此。

如果您避免使用 sleep 系统调用,则set_time_limit(5);在 CLI 脚本中应该可以正常工作。这是一个应在 5 秒后退出的测试脚本:

<?php
set_time_limit(5);

$start = time();
$last = 0;

for ($i=0;$i>=0;$i++) {
    if ($i%10000==0) {
        $took = time()-$start;
        if ($took!=$last) {
            echo "taken {$took} s so far...\n";
            $last=$took;
        }
    }
}
php timeout_test.php 
taken 1 s so far...
taken 2 s so far...
taken 3 s so far...
taken 4 s so far...
taken 5 s so far...
PHP Fatal error:  Maximum execution time of 5 seconds exceeded in /home/tom/MailChap/timeout_test.php on line 8
PHP Stack trace:
PHP   1. {main}() /home/tom/MailChap/timeout_test.php:0

相关内容