如何增加读取超时错误发生的时间?

时间:2010-03-25 16:55:03

标签: php firefox zend-framework timeout

我用PHP编写了一个脚本,需要很长时间才能执行[数千张图片的图像处理]。这是一小时 - 也许是5小时。

处理15分钟后,我收到错误:


ERROR 无法检索请求的网址

尝试检索网址时遇到以下错误:我点击的网址

Read Timeout

系统返回:[无错误]

等待从网络读取数据时发生超时。网络或服务器可能已关闭或拥塞。请重试您的请求。

您的缓存管理员是网站管理员。


我需要的是让该脚本运行更长时间。

现在,以下是所有技术信息: 我正在用PHP编写并使用Zend Framework。我正在使用Firefox。处理的长脚本在单击链接后完成。显然,由于脚本没有结束,我看到链接所在的网页,网页浏览器写“等待......”。 15分钟后发生错误。

我试图对Firefox进行更改:但是没有任何成功。我不知道,但其他地方可能需要进行更改。

那么,有什么想法吗?

非常感谢。

5 个答案:

答案 0 :(得分:1)

set_time_limit(0)只会影响脚本的服务器端运行。您收到的错误纯粹是浏览器方面的错误。您必须发送SOMETHING以防止浏览器决定连接已死 - 即使是单个输出字符(后跟flush()以确保它实际上通过网络发送)也可以。可能是每个处理过的图像,或者是固定的时间间隔(if last char sent more than 5 minutes ago, output another one)。

如果您不想要任何中间输出,可以执行ignore_user_abort(TRUE),这样即使连接从客户端关闭,脚本也会继续运行。

答案 1 :(得分:0)

使用set_time_limit

此处的文档

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

答案 2 :(得分:0)

如果您可以批量分割您的作品,处理X图像后会在其上显示包含一些javascript(或META重定向)的页面以打开链接http://server/controller/action/nextbatch/next_batch_id

冲洗并重复。

答案 3 :(得分:0)

批处理整个过程还有一个额外的好处,一旦出现问题,你不必重新开始整个过程​​。

如果您在自己的服务器上运行并且可以退出safe_mode,那么您也可以分叉后台进程来执行实际的繁重工作,而不受浏览器视图的影响。如果您处于多核或多处理器环境中,您甚至可以随时安排多个正在运行的进程。

我们为大型计算脚本做过类似的事情;流程的同步发生在共享数据库上---但幸运的是,它们的流程非常独立,我们唯一需要看到的就是它们的完成或终止。

答案 4 :(得分:0)

如果流程运行数小时,那么您应该考虑批处理。因此,您只需存储图像处理请求(在文件,数据库或适用于您的任何工作),而不是开始图像处理。然后,该请求由服务器上运行的调度(cron)进程获取,该进程将执行实际处理(这可以是调用set_time_limit(0)的PHP脚本)。处理完成后,您可以通过邮件或任何其他适合您的方式向用户发出信号,表明处理已完成。