我有一个PHP脚本,可以检查许多(数千个)网站的更新。 有时(随着站点数量的增加,更频繁),我在其中一个站点的更新中得到执行超时,整个脚本都耗尽了。
我能想到的最好的想法是分叉每个更新,所以如果它死了,整个更新就会继续。 从我收集到的内容来看,PHP线程似乎无法依赖,尤其是在Windows平台上(我很遗憾不得不继续使用)。
我考虑过使用curl作为分叉机制,但是服务器的成本是否会高得多(时间和处理能力)?
我很高兴听到有关PHP forking / threading的一些想法和经验......
感谢, 奥马尔。
答案 0 :(得分:2)
如果你打算使用cURL,请查看multi *系列方法,它允许你简化cURL并与一组网站进行交互。话虽这么说,你也可以设置你的最大执行时间(通过ini_set)到一个任意高的数字和/或保持自己的看门狗计数器,这样你就不会让它变得太高。
但是,是的,最终会遇到问题和PHP中缺乏完整的线程支持。因此,最好的办法是查看其他替代方案,例如:提供本机线程支持的其他语言/平台。
答案 1 :(得分:2)
我设法使用pcntl扩展程序在php中获得某种形式的线程。它不是最好的解决方案,但它确实有效。
http://www.php.net/manual/en/ref.pcntl.php
尝试以下链接,给了我一个如何进行实施的想法。
http://www.van-steenbeek.net/?q=php_pcntl_fork
http://www.hudzilla.org/phpbook/read.php/16_1_3
http://www.electrictoolbox.com/article/php/process-forking/
我希望这会有所帮助,但是php虽然没有很好的线程化。
答案 2 :(得分:1)
您可以将ini指令max_execution_time
设置为0.这应该删除最大执行时间,并允许脚本运行而不会产生此错误。必须在php.ini文件中设置此值,但使用ini_set
不起作用。
答案 3 :(得分:1)
set_time_limit(0);
答案 4 :(得分:1)
嗯,最后我去了卷曲,它运作得很好。
我需要一个跨平台的解决方案,因为我在Mac上开发,而在这种情况下,生产服务器是Windows。这意味着pcntl
是不可能的。
我担心向我自己的服务器发送数千个卷曲请求可能会占用它并在网站上打扰用户,但我错了。
但是,我确实必须在脚本中添加set_time_limit(0)
来启动所有curl调用,否则它只会超时。