代码之家  ›  专栏  ›  技术社区  ›  JochenJung

php在10秒后关闭连接,没有数据被回送

php
  •  3
  • JochenJung  · 技术社区  · 14 年前

    我有一个PHP网页,它会生成统计信息,在发送到浏览器之前需要大约15秒的时间来生成统计信息。

    我所面临的问题是浏览器最终会加载一个空白页面。很遗憾,我没有访问错误日志文件的权限。

    但是我想,如果我开始在foreach循环中发送数据,这样会消耗大部分生成时间

    echo ' ';
    

    连接将不会终止,页面将加载。

    首先,我认为这可能是内存限制或最大执行时间问题,所以我增加了两者,没有任何运气。但这对我来说也很奇怪,因为无论我发送什么,只要达到最大执行时间都会导致空白页。 echo ' ' 或者没有。

    我不知道还有没有其他的PHP设置会导致连接在大约10秒后终止而不发送数据?

    编辑 :

    页面并非完全空白。以下是发送的数据:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
      <meta name="author" content="Gerd Grützmacher">
      <meta name="robots" content="index,follow">
      <meta http-equiv="Language" content="de">  
      <link rel="icon" href="/favicon.png" type="image/png">
    
      <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    
      <!--[if (gte IE 5.9)]><!-->
      <link rel="stylesheet" type="text/css" href="css/gruppenunterkuenfte-min.css" />
      <!--<![endif]-->
    
      <!--[if IE 6]>
      <style type="text/css" media="screen, projection">
           @import url(css/ie6.css);
      </style>
      <![endif]-->
    
      <!--[if gte IE 5.9]><!-->
        <script type="text/javascript" src="scripts.js"></script>
      <!--<![endif]-->
    

    在这之后,统计数据被生成,因此我只看到一个空白页。

    以下是HTTP头:

    quest URL:http://gruppenunterkuenfte.de/index.php?mod=home&action=stats_belegungsanfrage2
    Request Method:GET
    Status Code:200 OK
    Request Headers
    Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    Cache-Control:max-age=0
    Referer:http://gruppenunterkuenfte.de/index.php?mod=home&action=stats_belegungsanfrage2
    User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3
    Query String Parameters
    mod:home
    action:stats_belegungsanfrage2
    Response Headers
    Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Connection:close
    Content-Type:text/html; charset=utf-8
    Date:Sat, 25 Sep 2010 15:07:11 GMT
    Expires:Thu, 19 Nov 1981 08:52:00 GMT
    Pragma:no-cache
    Server:Apache/2.2.16
    Transfer-Encoding:chunked
    X-Powered-By:PHP/5.2.11
    
    10 回复  |  直到 10 年前
        1
  •  0
  •   Sabeen Malik    14 年前

    这是我的2美分:

    首先,我要确保所有类型的缓冲都已关闭。一位先生有点像是曾经提供过这样的代码:

    @apache_setenv('no-gzip', 1);
    @ini_set('zlib.output_compression', 0);
    @ini_set('implicit_flush', 1);
    for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
    ob_implicit_flush(1);
    

    之后,我建议您发送一个 echo ' '; 在一些间隔之后。例如,如果您的代码有一个循环,那么在每10次迭代或类似的迭代之后,根据每次迭代所花费的时间发送一个回声。这样你就不会浪费时间发送回声了,佩奇也会保持活力。

        2
  •  1
  •   jay.lee    14 年前

    根据目前的信息,我认为浏览器可能由于不活动而导致连接超时。

    当您输出延迟的单个字符时( ' ' 在你的情况下)尝试 flush() 在它之后调用,尝试通过网络刷新缓冲区,并希望生成一些活动。如果这不起作用,可以尝试发送一个更大的字符串;可能需要在输出缓冲区完全刷新之前填充它。

        3
  •  0
  •   mrpatg    14 年前

    不确定代码的布局,但是如果要循环显示任何结果,请尝试在每个循环中重复它们,或者在每个循环中重复某些内容。

    看不见代码,很难说。

        4
  •  0
  •   Petah    14 年前

    在执行任何操作之前,请检查启用的错误报告是否没有发生错误:

    <?php
    error_reporting(E_ALL);
    ini_set('display_errors', '1');
    
        5
  •  0
  •   wimvds    14 年前

    很遗憾,我没有访问错误日志文件的权限。

    错误…为什么不将错误日志指向您有权访问的文件/位置?只需在脚本开始时使用ini_set,即。

    ini_set('log_errors', 1);
    ini_set('error_log', '/path/to/yourlog.log');
    

    您还可以更改 错误报告 你觉得合适。

        6
  •  0
  •   Bery    14 年前

    您是否尝试在本地计算机上调试代码?我在ISP服务器上设置错误消息时遇到了一些问题。他们为所有客户机管理它们,并将它们隐藏起来——他们认为这样做可以防止客户看到难看的警告或错误(例如,在php更新之后)。

    1. 如果您没有看到任何错误,请尝试在本地主机上测试它。
    2. 如果您在浏览器中没有看到任何连接超时(至少我的火狐会打印它),那么在服务器和客户机之间不会导致超时。

    我建议您试着调试代码-试着找出为什么输出会在包含JS文件的情况下停止。脚本是否总是停在同一行?

        7
  •  0
  •   bcosca    14 年前

    确保不发送控制字符。它们将终止HTML输出。您可能想尝试:

    echo preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F]/','',$output);
    

    这将输出所有字符,包括空格(制表符、回车、换行符)。

        8
  •  0
  •   ts.    14 年前

    您是否试图在脚本的开头(内容类型或类似的内容类型)感知任何标题?

        9
  •  0
  •   Sekhar    14 年前

    如何发送浏览器两个组件,一个Ajax块和一个iframe-hidden iframe可能是..使用iframe meta-refresh 为了让它保持刷新状态-并使用Ajax块等待您的PHP代码输出。

        10
  •  0
  •   mellowsoon    14 年前

    您的代码可能正在崩溃Apache,或者PHP可能正在崩溃。在这两种情况下,都不能将错误消息发送回浏览器。您是否在家用计算机上使用相同版本的Apache和PHP进行测试?相同的操作系统?

    而不是在你的循环中回音“”,尝试睡眠(10)。如果页面在10秒后没有变为空白,您就会知道这不是超时问题。

    看看你在前臂环里做什么。有一百种东西可能会使Apache、PHP或两者都崩溃。尤其是在进行大量数据处理的情况下。