我一直在寻找过去2天的原因,我在互联网和堆栈上尝试了很多解决方案。
我有一个带有ubuntu 16.04和apache2的专用虚拟机 - >服务器版本: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秒而不会被杀死。
为什么没有应用超时的任何想法?
由于
答案 0 :(得分:0)
max_execution_time不一定转换为http请求将花费多长时间。您的php脚本可以运行其他进程,这些进程不会被计为执行时间。例如,如果运行大型数据库查询,则花费的时间将不会计入max_execution_time。在这些情况下,将强制执行Apache超时。在ubuntu上,您的apache2.conf文件应包含以下一行:
Timeout 300
这是实际的限制,其中包括所有数据库查询,curl请求,exec调用和其他外部进程所花费的时间。