1

我有一个 php 脚本需要很长时间才能完成,并且由于执行超时(脚本运行时间过长)或网络超时而失败。

本质上,该脚本执行了一个 for 循环,该循环在每次迭代中执行两到三个过程。

  1. 通过 curl 请求外部服务
  2. 解析xml
  3. 将响应插入数据库

假设每次迭代需要 1-2 秒才能完成。

为了解决超时问题,我尝试将其设置max_execution_timeoutdefault_socket_timeout0。请让我知道这是否正确。

需要注意的关键点是 for 循环可以处理 70,000 条记录——它基本上是一个批量 SMS 系统。

我尝试使用flush()orob_implicit_flush(true)并设置output_buffering为 0 向浏览器发送部分响应,但我只得到最终响应而不是部分响应。

(原文如下)


嗨,我想在我的一个项目中获得帮助..我会解释这些问题..我在做什么是执行一个长的 php 脚本...它需要很长时间才能完成运行它..我遇到脚本执行超时和网络超时问题..在我的脚本中..它是一个for循环,每次迭代都会执行2-3个进程...一个正在请求外部服务(通过curl)并获取响应并传递xml,插入对数据库的响应...假设每次迭代大约需要 1-2 秒...对于超时问题,我尝试将“max_execution_timeout”和“default_socket_timout”设置为 0..请建议是否有任何问题。 .即使这是暂时的......主要需要注意的是循环......可能有超过70k的记录......它基本上是一个批量短信系统......这个超时主要是当浏览器抱怨服务器时..我等待你的回复好几个小时,我该睡觉了..再见..这是我到目前为止学到的......所以我想排队将记录列表长成小块并执行这些记录并将响应发送到浏览器从而满足它......但我几天来一直在解决的问题是将部分响应发送到浏览器......使用flush()或ob_implicit_flush (true);...并将 output_buffering 设置为 0...尝试了所有可能性...但我只得到最终响应而不是部分响应...而且我唯一的目的是保持进程处于活动状态...这可能是什么...任何解决方案...请帮帮我..所以再见..这是我到目前为止所学到的......所以我想将长长的记录列表排成小块并执行这些并将响应发送到浏览器从而满足它......但我一直在解决问题几天来正在向浏览器发送部分响应......使用flush()或ob_implicit_flush(true);......并将output_buffering设置为0......尝试了所有可能性......但我只得到最终响应和不是部分的......而且我唯一的目的是保持进程活跃......这可能是什么......任何解决方案......请帮助我......所以再见..这是我到目前为止所学到的......所以我想将长长的记录列表排成小块并执行这些并将响应发送到浏览器从而满足它......但我一直在解决问题几天来正在向浏览器发送部分响应......使用flush()或ob_implicit_flush(true);......并将output_buffering设置为0......尝试了所有可能性......但我只得到最终响应和不是部分的......而且我唯一的目的是保持进程活跃......这可能是什么......任何解决方案......请帮助我......但是我几天来一直在解决的问题是将部分响应发送到浏览器......使用flush()或ob_implicit_flush(true);......并将output_buffering设置为0......尝试了所有可能性......但我只得到最终的回应而不是部分的回应......而且我唯一的目的是保持进程活跃......这可能是什么......任何解决方案......请帮助我......但是我几天来一直在解决的问题是将部分响应发送到浏览器......使用flush()或ob_implicit_flush(true);......并将output_buffering设置为0......尝试了所有可能性......但我只得到最终的回应而不是部分的回应......而且我唯一的目的是保持进程活跃......这可能是什么......任何解决方案......请帮助我......

4

2 回答 2

4

你应该在 cron 工作中做那种事情。如果远程服务器有明显的延迟或网络错误,它很容易使与客户端浏览器的连接超时,并可能在 Web 客户端连接崩溃后让僵尸进程继续运行。

于 2009-10-15T12:59:14.883 回答
1

如前所述,您的脚本应该作为 cron 运行。

如果客户端必须对正在发生的事情进行半实时预览,我会建议一个不同的 html 页面,该页面通过 AJAX 在预定的时间段内查询服务器,并更新本应保存到数据库中的响应。

如果你把事情分开,你可以两全其美。

a) 服务器将自行处理长查询 - 客户端或未连接客户端 b) 客户端将在需要时查看服务器完成工作的进度

于 2009-10-15T14:28:55.307 回答