【问题标题】:php7 timeout not enforcedphp7超时未强制执行
【发布时间】:2016-09-18 11:00:43
【问题描述】:

过去 2 天我一直在寻找原因,我在互联网上和堆栈上尝试了很多解决方案。

我有一个带有 ubuntu 16.04 和 apache2 的专用 VM -> 服务器版本:Apache/2.4.18 (Ubuntu),默认 php 安装: php -v

PHP 7.0.8-0ubuntu0.16.04.2 (cli) ( NTS ).

phpinfo()

PHP Version 7.0.8-0ubuntu0.16.04.2

最近我注意到脚本可以永远运行,没有强制执行超时限制。

我做了一个 phpinfo() 来获取使用的 php.ini 文件。我在 php.ini 中检查了以下参数:

default_socket_timeout = 60
session.gc_maxlifetime = 1440
max_execution_time = 30
max_input_time = 60

我什至将它们设置为 3 秒(max_execution_time、max_input_time 和 default_socket_timeout),重新启动 apache,但没有结果。

例如以下代码(而且它不是我尝试过的唯一代码)不会超时,它会一直运行到完成:

echo "<br>initial max_execution_time: " . ini_get('max_execution_time') ;
print_r(set_time_limit(2));
echo " - set_time_limit\n";
echo "<br>initial max_execution_time: " . ini_get('max_execution_time') ;
ini_set('max_execution_time', '1');
echo "<br>initial max_execution_time: " . ini_get('max_execution_time') ;
ini_set('default_socket_timeout','1');
echo "<br>ini_get('default_socket_timeout')". ini_get('default_socket_timeout');
//phpinfo();


set_time_limit(1);
$i = 0;
while(++$i < 1000000001){
        if($i % 100000 == 0){
                echo $i / 100000, "<br/>\n";
        }
}
echo "done.<br/>\n";

输出告诉我超时设置正确,但就像我说的,脚本运行了 32 秒而没有被杀死。

任何想法为什么不应用超时?

谢谢

【问题讨论】:

  • 感谢您的回复。这个帖子stackoverflow.com/questions/5874950/… 说即使在 CLI 超时也应该有效。我不知道有 2 种类型的 php 安装(有和没有 CLI)
  • 但是等等,CLI 的意思是命令行界面,对吧?我的脚本在 chrome 或 ffox 等浏览器中执行。这应该从 php.ini 获得超时,或者?
  • 我检查了所有 php.ini 文件,都最多 30 秒。但是 phpinfo() 应该显示正在使用的那个,我检查了那个。 (我在服务器上找到了可能在任何地方的任何 php.ini 文件)
  • 没错,那我就迷路了
  • 不用担心,感谢您的宝贵时间。真的很感激。

标签: php apache ubuntu


【解决方案1】:

max_execution_time 不一定转换为 http 请求需要多长时间。您的 php 脚本可以运行其他进程,这些进程不会计入执行时间。例如,如果您运行大型数据库查询,则它所花费的时间将不计入 max_execution_time。在这些情况下,将强制执行 apache 超时。在 ubuntu 上,你的 apache2.conf 文件应该包含一行:

Timeout 300 

这将是实际限制,包括所有数据库查询、curl 请求、exec 调用和其他外部进程所需的时间。

【讨论】:

    猜你喜欢
    • 2013-10-23
    • 2011-03-02
    • 2021-09-26
    • 2017-07-21
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多