关于PHP执行超时的问题

PHP配置文件的参数max_execution_time表示脚本执行超时时间

max_execution_time=0表示不限制

max_execution_time=2表示执行两秒后终止,同时报错Fatal error: Maximum execution time of 2 seconds exceeded

但是,sleep(10)函数是不起作用的。

例如,php.ini中的max_execution_time=2

执行代码 <?php sleep(10);echo ‘ok‘; ?> 是不会超时的(前提是web服务器不超时)

执行代码 <?php echo 1;for($i=0;$i<100000000000;$i++){ for($i=0;$i<100000000000;$i++){}} echo 2;?> 会超时,输出1,且报错

注:set_time_limit()函数是可以覆盖max_execution_time参数的,可以比max_execution_time参数大,也可以为0表示不限制,当然

当此函数被调用时,set_time_limit()会从零开始重新启动超时计数器。换句话说,如果超时默认是30秒,在脚本运行了了25秒时调用 set_time_limit(20),那么,脚本在超时之前可运行总时间为45秒



还有一种情况

如果PHP工作在php-fpm模式,例如web服务器是nginx

这时候的超时还取决于php-fpm.conf中的配置request_terminate_timeout

这个参数是这么解释的:the timeout for serving a single request after which the worker process will be killed. This option should be used when the ‘max_execution_time‘ ini option does not stop script execution for some reason.

大概的意思是如果max_execution_time这个参数没有限制脚本的执行,就取决于这个参数的超时,例如,max_execution_time=0;或者max_execution_time大于request_terminate_timeout的值,或者程序中有sleep(),最终的超时都取决于request_terminate_timeout参数;

当然如果程序是因为request_terminate_timeout超时是不会有内容输出的,会报502错误,502 Bad Gateway/Nginx 1.7



综上,总结下列对照表,如果有不对的地方,欢迎大家指正

 
非fpm

max_execution_time=4


fpm

request_terminate_timeout=8

max_execution_time=4


fpm

request_terminate_timeout=4

max_execution_time=8


fpm

request_terminate_timeout=4

max_execution_time=0


<?php

echo 1;sleep(10);echo 2;

?>

输出:12 输出:502 Bad Gateway  输出:502 Bad Gateway  输出:502 Bad Gateway

<?php

echo 1;$i=0;

while($i++<1000000000)

{//假设会执行很久}

echo 2;

?>


输出:1

Fatal error: Maximum execution

time of 4 seconds exceeded


输出:1

Fatal error: Maximum execution

time of 4 seconds exceeded

 输出:502 Bad Gateway  输出:502 Bad Gateway
时间: 2024-12-26 11:48:28

关于PHP执行超时的问题的相关文章

C# 给某个方法设定执行超时时间 C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

在某些情况下(例如通过网络访问数据),常常不希望程序卡住而占用太多时间以至于造成界面假死. 在这时.我们可以通过Thread.Thread + Invoke(UI)或者是 delegate.BeginInvoke 来避免界面假死, 但是这样做时,某些代码或者是某个方法的执行超时的时间还是无法操控的.那么我们又是否有一种比较通用的方法.来设定某一个方法的执行超时的时间,让该其一旦超过指定时间则跳出指定方法.进而继续向下执行呢? 答案当然是肯定的. delegate.BeginInvoke可以实现代

shell脚本执行超时怎么办?

在shell里会有一种不太常见的情况,就是脚本有时候会出现超时的现象.一般来说遇到这种问题,我们都会简单粗暴的采用下面这种脚本来当"超时看门狗": #!/bin/bash ./$1 &    #这里设定后台运行的第一个参数 pid = $!    #最后一个运行的process的PID值 sleep $2 && kill -9 $pid &    #如果超过了$2的值的话,就会把那个PID干掉 这个脚本搭配两个变量使用的话,监控一点小代码还算OK,但是它

nginx后端服务器返回给nginx502、504、404、执行超时等错误状态的解决方法

今天公司的网站访问的时候全部变成404页面,查看网站的文件没有问题,来检查nginx的配置的时候,发现后端的一台服务器不可用,直接访问那台后台的服务器的时候,返回的是404页面,因为upstream 里面设置了ip_hash.所以导致我怎么刷新都是404页面.由此想到了nginx的一个功能,就是当后端的服务器返回给nginx502.504.404.执行超时等错误状态的时候,nginx会自动再把这个请求转发到upstream里面别的服务器上面,从而给网站用户提供更稳定的服务. 配置如下:locat

C# 给某个方法设定执行超时时间

在某些情况下(例如通过网络访问数据),常常不希望程序卡住而占用太多时间以至于造成界面假死. 在这时.我们可以通过Thread.Thread + Invoke(UI)或者是 delegate.BeginInvoke 来避免界面假死, 但是这样做时,某些代码或者是某个方法的执行超时的时间还是无法操控的.那么我们又是否有一种比较通用的方法.来设定某一个方法的执行超时的时间,让其一旦超过指定时间则跳出指定方法.进而继续向下执行呢? 答案当然是肯定的. delegate.BeginInvoke可以实现代码

Java程序执行超时——Future接口介绍

在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API的一部分,在java.util.concurrent包中.Future接口是Java线程Future模式的实 现,可以来进行异步计算. Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务.期间我自己可以去做任何想做的事情.一段时 间之后,我就便可以从Future那儿取出结果.就相当

线程执行超时处理、并发线程数控制

说明: 1.为了测试方便,这里对存储过程的执行是模拟的 2.这里限制了并发执行存储过程的最大个数,但并没有对并发线程数进行控制,与文章标题略有不符,但程序稍做改动即可控制并发线程数 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.OracleClient; using System.Diagnostics; u

java方法执行超时关闭

Callable<String> task = new Callable<String>() { @Override public String call() throws Exception{ //执行耗时代码 Thread.sleep(10000); return "success"; } }; ExecutorService executorService = Executors.newSingleThreadExecutor(); Future<S

ASP.NET LINQ SQL执行超时的问题

最近在写一个航材取价的程序.由于执行的语句复杂,数据量比较大,容易造成超时. 看提示应该是执行SQL的时候超时,我在程序中用的linq. 实际把SQL语句单独执行的时候观察也要40秒左右. 查资料得知 SqlCommand.CommandTimeout 获取或设置在终止执行命令的尝试并生成错误之前的等待时间. 等待命令执行的时间(以秒为单位).默认为 30 秒. 实际观察的时候也发现,一般提示出错就是在执行语句30秒的时候. 为解决此问题可以在程序中自定义设置执行语句超时的时间. 传统的ADO.

阿里云创建邮件告警 python 脚本,执行超时

现象:做了一个邮件告警脚本,python 写的,名称 mail.py,内容如下 #!/usr/bin/python #coding:utf-8 import smtplib from email.mime.text import MIMEText import sys mail_user = '[email protected]' mail_pass = '8xxxxxxxxxxxxj' def send_mail(to_list,subject,content): me = "zabbix 监