在PHP中运行异步函数的最有效方法是什么?

时间:2011-10-17 13:38:14

标签: php mysql asynchronous synchronization amazon-mws

我正在开发一个利用亚马逊MWS API的应用程序,该API主要使用PHP编写。此应用程序允许亚马逊卖家注册,提供一些亚马逊卖家凭证,然后应用程序开始从亚马逊下载此用户的订单,将其放入MySQL数据库。

我已经构建了使用具有多个函数的脚本将数据准确地同步到数据库的方法,但是注意到这需要太长时间。此脚本只是循环遍历数据库中的所有用户,并一次迭代所有订单。现在,只有5个测试用户,时间是可行的,但我正在寻找一种更具扩展性的方法。想想每个同时运行一个的500个用户。太久了!

我是PHP的新手,尤其是从中运行异步进程。我发现我能做到这一点的唯一方法是使用一个启动脚本来查找数据库中的所有用户,并为每个用户生成一个同步脚本然后释放它。我不喜欢这个想法,因为如果我有500多个用户,我的夜间同步将包含500个这个PHP脚本的衍生实例。

以前有人做过类似的事吗?如果是这样,我很想知道如何更好地提高同步效率。

3 个答案:

答案 0 :(得分:2)

由于PHP不能是多线程 1 ,实际上你只有2个选择(有几种方法可以做到这一点,但它们都归结为以下类别):

  • 每个用户操作有1个进程。如你所说,对于大型数据库,这可能会导致很多进程。
  • 有一个处理多个用户的流程。这可能会花费更长的时间,因为每个过程都是有效的同步。

我认为最好的办法是将这两种方法结合起来,这样就有多个流程可以处理多个用户。因此,如果您有500个用户,则生成100个进程,每个进程处理5个用户,或50个进程,每个进程处理10个用户。

或者,可能值得用更适合任务的语言编写程序 - 支持多线程的程序,如Java或Perl - 如果需要,可以从PHP开始。

1 编辑03/2013:PHP现在可以是多线程的,但不推荐用于生产,因为pthreads扩展仍然非常不稳定,而且它也不是建议普通用户使用,如果你真的知道自己在做什么

答案 1 :(得分:1)

与DaveRandom达成协议,查看HTTP请求池以实现,而不是滚动自己的http://www.php.net/manual/en/class.httprequestpool.php

答案 2 :(得分:0)

我最终使用了passthru并将脚本传递给后台。到目前为止,事情似乎运作良好。