2

我有一个 php 脚本,可以检查许多(数千个)站点的更新。有时(随着站点数量的增加更频繁),我在更新其中一个站点时遇到执行超时,整个脚本都付诸东流。

我能想到的最好的主意是分叉每个更新,所以如果它死了,整个更新就会继续。从我收集到的信息来看,PHP 线程似乎不是可以依赖的东西,尤其是在 Windows 平台上(不幸的是,我不得不在这个平台上工作)。

我考虑过使用 curl 作为分叉机制,但是对于服务器来说(在时间和处理能力方面)成本会不会更高?

我很高兴听到一些关于 PHP 分叉/线程的想法和经验......

谢谢,奥马尔。

4

5 回答 5

2

如果您要使用 cURL,请查看 multi* 系列方法,这些方法允许您简化 cURL 并与一组站点进行交互。话虽如此,您还可以将最大执行时间(通过 ini_set)设置为任意高的数字和/或保留自己的看门狗计数器,这样您就永远不会让它变得太高。

但是,是的,最终会遇到问题,并且 PHP 中缺乏完整的线程支持。因此,您最好的选择是查看其他替代方案,例如提供本机线程支持的其他语言/平台。

于 2009-03-02T09:03:45.737 回答
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 在线程方面并不是很好。

于 2009-03-02T10:48:25.577 回答
1

您可以将 ini 指令设置max_execution_time为 0。这应该会删除最大执行时间,并允许脚本运行而不会产生此错误。但是,必须在您的 php.ini 文件中设置此值 - 使用ini_set不起作用。

于 2009-03-02T09:00:12.093 回答
1
set_time_limit(0);

set_time_limit 文档

于 2009-03-02T09:37:14.627 回答
1

好吧,最后我选择了 curl,它工作得很好。

我需要一个跨平台的解决方案,因为我在 Mac 上开发,而在这种情况下,生产服务器是 Windows。这意味着pcntl不可能。

我担心向我自己的服务器发送数千个 curl 请求可能会占用它并打扰当时网站上的用户,但我错了。

但是,我确实必须在set_time_limit(0)启动所有 curl 调用的脚本中添加一个,否则它只会超时。

于 2009-03-03T15:46:04.980 回答