PHP线程池?

时间:2010-04-07 11:48:48

标签: php multithreading concurrency

我已安排CRON作业每4小时运行一次,需要收集用户帐户信息。 现在我想加快速度并在多个进程之间拆分工作,并使用一个进程使用从其他进程检索到的数据来更新MySQL数据库。

在JAVA中我知道有一个线程池,我可以专门用一些线程来完成一些工作。

我如何在PHP中完成?

欢迎任何建议。

感谢

7 个答案:

答案 0 :(得分:6)

PHP可能不是最适合多线程的语言。

您可能希望了解不同的解决方案。例如,Thrift允许您使用Java后端与Java后端进行通信,您可以在其中轻松实现所需的行为。

如果您仍想在PHP中执行此操作,可能需要查看:

http://www.php.net/pcntl

http://www.electrictoolbox.com/article/php/process-forking/

答案 1 :(得分:2)

PHP和Threads(这两个单词)不能在同一个句子中一起出现。 PHP不提供线程支持。您可以尝试使用pcntl forking机制或异步处理,在您的情况下无效。

您可以通过查看Gearman(建议您使用google)来使用可能是您想要的工作负载分配机制。

正如其他人所描述的那样“它是一个分布式分叉机器”,可以提供您正在寻找的工作负载分配,以“加快速度”。

的问候,

答案 2 :(得分:1)

正如其他人所说,分叉过程比用PHP生成线程更容易。但是为什么你认为有一个专用线程将结果写回数据库是一个好主意?虽然这对于线程而不是进程稍微简单一些,但它仍然是一个复杂的开销,似乎没有为整体目标增加任何价值。

实际上,从cron启动脚本的几个实例(带有一些分区数据参数)比从PHP代码中启动一个fork更简单 - 而且不用担心任何记录数据的瓶颈进入数据库。

下进行。

答案 3 :(得分:0)

查看这些帖子 -    * http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html    * http://www.electrictoolbox.com/article/php/process-forking/

基本上你需要在进程之间共享数据,正如我所看到的,你可能需要先写一些文件。使用主进程获取(使其成为ajax-polling类型进程)并写入DB。

答案 4 :(得分:0)

您也可以在PHP中分叉新进程:pcntl_fork()

顺便说一句。该脚本运行时间超过4小时?否则,我认为没有理由将其与线程或流程管理混淆。

答案 5 :(得分:0)

您还可以查看本文,其中介绍了如何模拟线程,包括使用异步HTTP调用的线程池管理器和Web服务器:

http://w-shadow.com/blog/2008/05/24/improved-thread-simulation-class-for-php/

答案 6 :(得分:0)

Arbow on github的好过程池 修改后提到here