浏览器显示服务器进程仍在运行时超时

时间:2013-07-25 07:39:02

标签: php apache internet-explorer browser timeout

我遇到以下问题:

  1. 我正在运行BIG内存进程,但已将内存负载分成较小的块,因此没有CPU超时问题。
  2. 在服务器中,我正在创建大小约为100kb的.xml文件,它们将在100 +左右创建。
  3. 现在的主要问题是浏览器显示响应超时和下面的IE(只是上方状态栏)显示.php文件下载消息。
  4. 在此期间,后端(服务器端)进程仍在运行,并以增量顺序连续创建.xml文件。所以没问题。
  5. 我有以下php.ini配置。

    max_execution_time = 10000     ; Maximum execution time of each script, in seconds
    max_input_time = 10000 ; Maximum amount of time each script may spend parsing request data
    memory_limit = 2000M      ; Maximum amount of memory a script may consume (128MB)
    ; Maximum allowed size for uploaded files.
    upload_max_filesize = 2000M
    

    我在IE上运行我的网站。我正在使用ZSCE和PHP 5.3

    在这个问题上,有人可以正确地重定向我吗?

    修改

    上传Time out图像,这就是为什么要求.php文件下载。

    enter image description here


    编辑2:

    我简要解释一下我的执行流程:

    1. 我有一个包含Class Hierarchies对象的PHP文件,它将从每个类Hierarchy开始执行Function1()。
    2. 我有班级档案。
    3. 首先,假设执行Function1(),其中包含以块的形式创建XML文件的逻辑。
    4. 其次,假设执行Function2(),它将显示Function1()生成的输出。
    5. 全部以类层次结构方式完成。所以我不能在执行之前终止执行Function1()直到它被执行。之后将调用Function2()。

      编辑3:

      这是specially for @hakre

      当你提出一些交叉问题并且我同意某些观点时,请让我详细描述一下这个问题。

      1. 首先,我一次加载大约100多个MB大小的XML文件,这就是为什么我的本地安装程序中的内存挂起并停止机器上的所有内容并且CPU时间正在利用其最多的资源。

      2. 然后,我将这些大尺寸的XML文件划分为小尺寸(意味着我现在一次加载单个XML文件,然后在使用后将其卸载)。这使我免于本地设置中的内存过载和CPU问题。

      3. 现在我的后端进程没有运行CPU或内存问题,但问题是浏览器超时。我甚至尝试过cURL,但根据我目前的结构,它似乎适合我的类层次结构问题。我在层次结构中有一组类,它们首先执行它们的Process函数,然后它们都执行它们的Output函数。因此,除非并且直到处理函数被执行,否则输出函数不会出现在图片中,这就是浏览器显示超时的原因。

      4. 我甚至关注instructions suggested by @vortex并没有取得什么成功,但不是我想要的。为什么我无法实现cURl,因为我的流程功能是一次性创建所需的XML文件,因此输出到浏览器需要花费太多时间。由于过程功能需要花费很长时间才能分配给客户端,除非并且直到它完成。

      5. cURL输出:

        URL....: myurl 
        
        Code...: 200 (0 redirect(s) in 0 secs) 
        
        Content: text/html Size: -1 (Own: 433) Filetime: -1 
        
        Time...: 60.437 Start @ 60.437 (DNS: 0 Connect: 0.016 Request: 0.016) 
        
        Speed..: Down: 7 (avg.) Up: 0 (avg.) 
        
        Curl...: v7.20.0 
        

        test.txt文件的内容

        * About to connect() to mylocalhost port 80 (#0)
        
        *   Trying 127.0.0.1... * connected
        
        * Connected to mylocalhost (127.0.0.1) port 80 (#0)
        
        \> GET myurl HTTP/1.1
        Host: mylocalhost
        Accept: */*
        
        < HTTP/1.1 200 OK
        
        < Date: Tue, 06 Aug 2013 10:01:36 GMT
        
        < Server: Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/0.9.8o
        
        < X-Powered-By: PHP/5.3.9-ZS5.6.0 ZendServer
        
        < Set-Cookie: ZDEDebuggerPresent=php,phtml,php3; path=/
        
        < Cache-Control: private
        
        < Transfer-Encoding: chunked
        
        < Content-Type: text/html
        
        < 
        * Connection #0 to host mylocalhost left intact
        
        * Closing connection #0
        

        免责声明 :根据所选答案的第一个小成功选择此问题的答案。当发生这类问题时,来自@Hakre的解决方案也是可行的。但是现在没有任何答案可以解决我的问题。如果有人发现有关此类问题的详细信息,Hakre的答案也会更加详细。

8 个答案:

答案 0 :(得分:10)

假设您进行了所有服务器端修改,因此您避开了服务器超时[我看到上面几乎解释的每一个],为了避免浏览器超时,您必须执行此类操作

<?php
set_time_limit(0);
error_reporting(E_ALL);
ob_implicit_flush(TRUE);
ob_end_flush();

我可以从经验告诉您,只要您不时地输出一些内容,Internet Explorer就没有任何问题。我每天运行一个30GB的数据库更新[大约需要2-4个小时]并且opera似乎是唯一忽略内容输出的浏览器。 如果你没有设置“ob_implicit_flush”,你需要在每个内容之后做一个“ob_flush()”。

参考

  1. ob_implicit_flush

  2. ob_flush

  3. 如果您不像我之前所写的那样在脚本顶部使用ob_implicit_flush,则需要执行以下操作:

    <?php
    echo 'dummy text or execution stats';
    ob_flush();
    

    在执行循环中

答案 1 :(得分:3)

  

1。我正在运行BIG内存进程,但已将内存负载分成较小的块,因此没有CPU超时问题。

现在这是一个疯狂的猜测。你是怎么发现它首先是CPU超时问题的?你有吗?如果是,您的测试现在给出了什么?如果没有,你现在如何测试这不是一个超时问题?

尽管你声明不存在某个问题,但你没有证明这一点,许多问题仍未解决。这会引发猜测,这对于解决问题会产生反作用(你在这里做)。

你在这里写的只是意味着你把代码编写到块内存中,但是,对于CPU超时问题,这是而不是测试。一个是编写代码,另一个是测试。不要混淆两者。并且不要画出疯狂的假设。问题是测试,否则没有发生。

您的第一点已经非常了解,在进行故障排除时,查看事实(监视器,测试,配置文件,步骤调试)不会运行假设。这是一种特殊情况,否则你会看错地方并提出错误的问题。


根据您描述的客户端(浏览器)的行为,这不是一个超时问题本身。您遇到的问题是标题响应和正文响应之间的答案会延长浏览器的味道。一个浏览器假定超时(因为这样的边界值已被触发,这看起来对我来说更正确)而另一个浏览器假设某事正在出现,为什么不保存它。

所以你这里只是一个处理问题。请咨询您的Internet浏览器(HTTP客户端)的内容,您可以更改哪些配置值以更改此行为。例如。在命令行上使用curl-request监视请求实际需要多长时间。然后将浏览器配置为在刚刚测量的时间内连接到该服务器时不会超时。例如,如果您使用的是Internet Explorer:http://www.ehow.com/how_6186601_change-internet-timeout-options.html,或者您使用的是Mozilla Firefox:http://forums.mozillazine.org/viewtopic.php?f=7&t=102322&start=0

由于您未在服务器端显示任何代码,我假设您希望使用客户端设置解决此问题。 Curl将帮助您衡量此类请求所需的秒数。使用-v(详细)开关获取有关请求的详细信息。

如果您不想在客户端上解决此问题,curl仍将帮助您测量重要数据并轻松重现任何与服务器相关的基础时序问题。因此,在任何情况下都应该在命令行上使用 Curl,尤其是在查看响应标头时可能会发现触发(再次)深奥的Internet Explorer行为的原因。 -v开关再次显示您请求响应标头。

如果您希望使用PHP脚本自动执行此类测试,则还可以使用PHP Curl Extension。这已在以下内容中概述:

答案 2 :(得分:1)

问题在于您的网络服务器,而不是浏览器。

如果您正在使用Apache,则需要在httpd.conf或虚拟主机配置中调整Timeout值。

答案 3 :(得分:1)

你有3页

  1. 进程 - 创建XML文件,然后更新数据库值,说明该过程已完成

  2. 根据流程完成数据库值的状态返回{true}或{false}的PHP页面

  3. 一个ajax前端,每隔几秒轮询第2页,检查天气是否完成过程

  4. Long Polling

答案 4 :(得分:0)

是否有可能在脚本处理时从脚本发送一些输出,甚至是空格?如果,那么它应该重置超时计数器。

如果不可能,则必须增加注册表中IE的超时时间:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings

您需要ReceiveTimeout,如果不存在,请将其创建为dword,并以毫秒为单位设置值。

答案 5 :(得分:0)

我已经多次遇到过这个问题,同时阅读大型csv文件并将其放入数据库中。我解决了这个问题,我将阅读和数据库处理分成了较小的部分。就像我创建了一个新表来记录引入和插入的数据量,以及下次页面重新加载并从该位置开始。所以你可以通过一次创建一个xml来完成它,然后重新加载页面并从下一个开始下一个表单。这样刷新浏览器使用的内存。 希望它会有所帮助。

答案 6 :(得分:0)

什么是“CPU超时问题”?

解决问题的正确方法是异步运行繁重的东西,in a seperate session group(不是网络服务器进程树)。

答案 7 :(得分:0)

尝试在PHP脚本页面中包含set_time_limit(0);

以下链接可能会对您有所帮助。

http://php.net/manual/en/function.set-time-limit.php

http://php.net/manual/en/function.ignore-user-abort.php