密集型PHP脚本失败w/";指定的超时已过期";错误/ap\u内容\u长度\u过滤器

密集型PHP脚本失败w/";指定的超时已过期";错误/ap\u内容\u长度\u过滤器,php,Php,正在运行失败的MySQL密集型PHP脚本。Apache日志报告了以下情况: [Wed Jan 13 00:20:10 2010] [error] [client xxx.xx.xxx.xxxx] (70007) The timeout specified has expired: ap_content_length_filter: apr_bucket_read() failed, referer: http://domain.com/script.php 已尝试将设置时间限制(0)置于顶部

正在运行失败的MySQL密集型PHP脚本。Apache日志报告了以下情况:

[Wed Jan 13 00:20:10 2010] [error] [client xxx.xx.xxx.xxxx] (70007)
The timeout specified has expired:
ap_content_length_filter: apr_bucket_read() failed,
referer: http://domain.com/script.php
已尝试将
设置时间限制(0)
置于顶部

还尝试设置时间限制(0)

两者都没有修复超时


我是否可以在
http.conf
(或其他地方)中设置一些特定的超时限制来防止这种情况

php.ini中也有超时。

还有php指令。请注意,web服务器的超时设置也可能会限制您的脚本:

您的web服务器可能有其他超时 也可能中断的配置 PHP执行。Apache有一个超时 指令和IIS具有CGI超时 功能。两者都默认为300秒。 有关详细信息,请参阅web服务器文档 具体细节


实际上,这看起来像一个Apache错误,它也会影响Python脚本。您是否尝试过

我在php.ini中使用了这些资源限制来纠正这个问题

max_execution_time = 300
max_input_time = 300
memory_limit = -1

还有一个超时值不是放在php本身中,而是放在apache服务器中。在指定的时间内,当输出上没有任何内容时,它将停止脚本,所以在PHP中执行更难的工作时,您可以达到此限制。只要将任何内容回显到浏览器(而不是缓冲区!),或者将apache超时值增加到安全值,就我所记得的,它是KeepAliveTimeOut apache属性。祝你好运:)

首先,我的解决方案只适用于Apache Web服务器

我正在编写一个脚本,用作针对非常大的数据库的报告的csv下载脚本,我也遇到了这个问题。我没有使用php,但我的脚本是用一种叫heitml;-)的晦涩语言编写的

请求超时问题在我的场景中确实会发生,如下所示:

[Wed Sep 19 20:29:01 2012] [warn] [client ::1] Timeout waiting for output from CGI script /var/www/cgi-bin/heitml
[Wed Sep 19 20:29:01 2012] [error] [client ::1] (70007)The timeout specified has expired: ap_content_length_filter: apr_bucket_read() failed
我目前唯一能适应的严肃解决方案就是在这里使用这个官方的超时配置扩展:。它允许调整超时参数,例如:

允许10秒接收请求(包括标题),30秒接收请求正文:

RequestReadTimeout header=10 body=30
至少允许10秒钟接收请求正文。如果客户端发送数据,则每接收1000字节,将超时时间增加1秒,超时时间没有上限(LimitRequestBody间接给出的限制除外):

允许至少10秒的时间来接收包括标题的请求。如果客户端发送数据,则每接收500字节,将超时时间增加1秒。但请求(包括标题)的时间不得超过30秒:

RequestReadTimeout header=10-30,MinRate=500
通常,服务器应该同时配置标头和正文超时。如果http和https虚拟主机使用公共配置,则不应将超时设置得太低:

RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

我还没有找到Apache提供的更好的解决方案,它不需要我使用this模块(假设它不是默认安装的——尽管它包含在所有版本2.2.15和更高版本中)。

我也遇到了与Apache 2.4.6PHP 5.4.23 FPM/FastCGI非常相似的问题

症状: 无论我在PHP或Apache中设置了什么,我的脚本都会在30秒内超时,我会在Apache错误日志中看到以下内容:

[timestamp][proxy\u fcgi:error][pid…](70007)指定的超时已过期:[client…]AH01075:将请求发送到的错误:

我的虚拟主机: 修复方法:它是Apache
mod\u proxy\u fcgi中的硬编码值

  • 有一个补丁可用(上面的链接)
  • 该修复程序似乎还没有正式发布(2014年3月)

注意:这个答案是从一个文件中逐字复制的

我有Apache2.4.6,但是Apache>=2.4.8中提供了修复它的方法。 这里的关键是立即启动输出,以便Apache(mod_proxy_fcgi)认为连接处于活动状态

例如,我正在使用PHP,AJAX调用的DB查询需要>30秒。 因为我知道总体响应将是“Content-Type:application/json”,所以我立即发送该标题

#1: Start output immediately
#Note: Sending the header is innocuous
#   it can be changed later using the $replace parameter
#   (see #3)
header( 'Content-Type: application/json' );

#2: Run slow query
mysql_query( "SELECT * FROM giant_table" );

#3: Change header as needed
header( 'Content-Type: application/csv', true );

#output content

我怀疑我遇到了相同的错误,更新为Apache的更高版本(2.4.16):

我想知道为什么在php.ini中增加最大执行时间不起作用

对我来说,修复方法只是增加httpd.conf中的Timeout指令

(或在
WHM
->
Apache配置中
->
全局配置
,视情况而定)


此超时适用于IO事件之间的时间。因此,即使脚本几乎立即输出数据,脚本执行中的长时间延迟导致了超时。

< P>我尝试了所有的建议,但是我的问题是在<强> PHP FPM配置>中。我在php fpm配置文件中设置了以下行:

request_terminate_timeout = 300s

对于任何可能遇到这种情况的人。我通过查看memcache解决了这个问题

我的情况:

  • 多个apache服务器正在使用的memcached服务器
  • memcached.sess_locking=On
  • 在同一会话上发出背靠背请求(彼此相隔毫秒)
  • 结果: 第二个请求被阻塞并超时

    解决方案1: 在php.ini中设置memcached.sess_locking=Off

    解决方案2: 减少memcached.sess\u lock\u wait\u min

    工作原理:
    当第一个请求锁定会话文件时,第二个请求进入时,第二个会话必须等待。如果memcached.sess\u lock\u wait\u min设置得太高,它只会等待那么长时间,然后再尝试获得锁的所有权。使用sess_locking=Off测试这一点非常容易。如果它确实对您有帮助,那么您肯定希望使用锁定时间值,看看什么更适合您。

    请注意,它仍在使用。它在2.4.8(2014-05-05)中已修复。是的,这是我的问题<代码>请求\终止\超时=123s
    so
    ini_set( 'max_execution_time', '120' );
    ...
    ini_restore( 'max_execution_time' );
    
    #1: Start output immediately
    #Note: Sending the header is innocuous
    #   it can be changed later using the $replace parameter
    #   (see #3)
    header( 'Content-Type: application/json' );
    
    #2: Run slow query
    mysql_query( "SELECT * FROM giant_table" );
    
    #3: Change header as needed
    header( 'Content-Type: application/csv', true );
    
    #output content
    
    [Tue Aug 02 11:49:41.930884 2016] [core:error] [pid 28640] (70007)The timeout specified has expired: [client xxx.xxx.xxx.xxx:xxxxx] AH00574: ap_content_length_filter: apr_bucket_read() failed, referer: https://domain.com/script.php
    
    Timeout 900
    
    request_terminate_timeout = 300s