我用PHP编写了一个脚本,需要很长时间才能执行[数千张图片的图像处理]。这是一小时 - 也许是5小时。
处理15分钟后,我收到错误:
ERROR 无法检索请求的网址
尝试检索网址时遇到以下错误:我点击的网址
Read Timeout
系统返回:[无错误]
等待从网络读取数据时发生超时。网络或服务器可能已关闭或拥塞。请重试您的请求。
您的缓存管理员是网站管理员。
我需要的是让该脚本运行更长时间。
现在,以下是所有技术信息: 我正在用PHP编写并使用Zend Framework。我正在使用Firefox。处理的长脚本在单击链接后完成。显然,由于脚本没有结束,我看到链接所在的网页,网页浏览器写“等待......”。 15分钟后发生错误。
我试图对Firefox进行更改:但是没有任何成功。我不知道,但其他地方可能需要进行更改。
那么,有什么想法吗?
非常感谢。
答案 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)
答案 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脚本)。处理完成后,您可以通过邮件或任何其他适合您的方式向用户发出信号,表明处理已完成。