我有一个PHP脚本需要很长时间才能完成,并且由于执行超时(脚本运行时间太长)或网络超时而失败。
本质上,脚本执行for循环,每次迭代执行两到三个进程。
假设每次迭代需要1-2秒才能完成。
要解决超时问题,我尝试将max_execution_timeout
和default_socket_timeout
设置为0.如果这是正确的,请告诉我。
要注意的关键点是for循环可以处理70,000条记录 - 它基本上是一个批量短信系统。
我尝试使用flush()
或ob_implicit_flush(true)
向浏览器发送部分回复,并将output_buffering
设置为0,但我只得到最终回复,而不是部分回复。< / p>
(原文如下)
您好, 我想在我的一个项目中得到帮助..解释问题..我在做什么是执行一个很长的PHP脚本...需要很长时间才能完成运行它...我遇到脚本执行超时和网络超时问题....在我的脚本中..一个for循环,它执行2-3个进程,每次迭代...一个请求外部服务(通过curl)并获取响应并粘贴xml,插入响应到数据库...假设每次迭代大约需要1-2秒......对于超时问题,我试图将“max_execution_timeout”和“default_socket_timout”设置为0 ..请指出它是否存在任何问题。这是暂时的...主要注意事项是循环..可能有超过70k的记录....它基本上是一个批量短信系统... 这个超时主要是当浏览器投诉服务器时...我等待你的响应很长时间以及它让我睡觉的时间......再见...这就是我到目前为止所学到的...所以我想到了排队将记录列表分成小块并执行这些记录并将响应发送到浏览器从而满足它...但是我已经解决了几天的问题是将部分响应发送到浏览器...使用flush()或ob_implicit_flush (true); ...并将output_buffering设置为0 ...尝试了所有可能性......但是我只获得了最终响应而不是部分响应...而且我的唯一目的是保持流程活跃...什么可能是这个......任何解决方案......请帮帮我..
答案 0 :(得分:4)
你应该在cron工作中做那种事情。如果远程服务器存在显着延迟或存在网络错误,则很容易超时与客户端浏览器的连接,并可能在Web客户端连接崩溃后使僵尸进程保持运行。
答案 1 :(得分:1)
如上所述,您的脚本应该作为cron运行。
如果客户端必须半实时预览正在发生的事情,我建议使用不同的html页面,在预先确定的时间段内通过AJAX查询服务器,并更新本应保存到数据库的响应。
如果你分开的话,你可以充分利用这两个世界。
a)服务器将自己处理长查询 - 客户端或没有连接的客户端 b)如果需要,客户将看到服务器完成工作的进度