4

我有以下问题:

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

我有以下 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 上运行我的网站。我正在使用带有 PHP 5.3 的 ZSCE

任何人都可以在这个问题上以正确的方式重定向我吗?

编辑:

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

在此处输入图像描述


编辑2:

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

  1. 我有一个带有类层次结构对象的 PHP 文件,它将开始从每个类层次结构执行 Function1()。
  2. 我有类文件。
  3. 首先,假设执行 Function1(),其中包含以块的形式创建 XML 文件的逻辑。
  4. 其次,假设执行 Function2(),它将显示 Function1() 生成的输出。

一切都以类层次结构的方式完成。因此,在 Function1() 执行之前,我无法终止它的执行。之后 Function2() 将被调用。

编辑3:

这是专门为@hakre 准备的

正如您提出的一些交叉问题,我同意一些观点,但让我更详细地描述这个问题。

  1. 首先,我一次加载大约 100+ MB 大小的 XML 文件,这就是为什么我的本地设置中的内存挂起并停止机器上的所有内容,而 CPU 时间正在利用其大部分资源。

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

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

  4. 我什至按照@vortex 建议的说明进行操作,但收效甚微,但不是我想要的。为什么我无法实现 cURl,因为我的流程功能是一次性创建所需的 XML 文件,因此输出到浏览器需要太多时间。由于 Process 函数花费了这么多时间,除非并且直到它完成,否则无法将输出分配给客户端。

卷曲输出:

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 的答案也更详细。

4

8 回答 8

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

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

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

在您的执行循环中

于 2013-08-05T08:16:30.560 回答
4

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(Verbose) 开关获取有关请求的详细信息。

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

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

于 2013-08-06T08:17:59.937 回答
1

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

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

于 2013-07-25T07:53:11.347 回答
1

你有 3 页

  1. 流程 - 创建 XML 文件,然后更新数据库值,表明流程已完成

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

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

长轮询

于 2013-07-31T13:08:59.147 回答
0

是否可以在脚本仍在处理时将一些输出发送到浏览器,甚至是空白?如果,那么做,它应该重置超时计数器。

如果不行,你必须在注册表中增加 IE 的超时时间:

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

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

于 2013-07-25T08:00:46.283 回答
0

在读取大型 csv 文件并将其放入数据库时​​,我曾多次遇到此问题。我解决了这个问题,我将读取和放入数据库过程分成更小的部分。就像我创建了一个新表来记录读取和插入的数据量,以及下次页面重新加载并从该位置开始。因此,您可以通过一次尝试创建一个 xml,然后重新加载页面并开始下一个表单来做到这一点。这样浏览器使用的内存就被刷新了。希望它会有所帮助。

于 2013-07-25T08:01:24.363 回答
0

什么是“CPU 超时问题”?

解决问题的正确方法是在单独的会话组(而不是 web 服务器进程树)中异步运行繁重的东西。

于 2013-07-31T12:16:03.157 回答
0

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

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

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

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

于 2013-08-03T01:57:01.927 回答