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

5

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

我已经构建了多个函数的脚本以精确同步数据到数据库中,但是发现这样做太慢了。这个脚本只是循环遍历所有用户并逐个迭代所有订单。现在,仅有5个测试用户时,时间还可以接受,但我正在寻找一种更可扩展的方法。想象一下,500个用户同时运行,一个接一个地同步。时间会非常长!

我对PHP和特别是从其中运行异步进程还很陌生。我找到的唯一方法是有一个启动脚本,找到数据库中的所有用户并为每个用户生成一个同步脚本,然后释放它。我不喜欢这个想法,因为如果我有500个以上的用户,我的每夜同步将包括500个此PHP脚本的实例。

有人以前做过类似的事情吗?如果有,我很想听听如何使这个同步更加高效。

3个回答

2

由于PHP无法进行多线程处理1,实际上你只有两个选择(有几种方法可以实现,但它们都可以归结为以下两个类别):

  • 每个用户操作一个进程。正如您所说,对于大型数据库,这可能会导致大量的进程。
  • 有一个进程处理多个用户。这将潜在地需要更长时间,因为每个进程实际上是同步的。

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

或者,也许值得编写一个用于此任务的更适合的语言程序 - 支持多线程的语言,如Java或Perl - 如果需要,您可以从PHP启动该程序。

1编辑03/2013:PHP现在可以进行多线程处理,但不建议在生产中使用,因为pthreads扩展仍然非常不稳定,并且也不建议普通用户使用,只有在确切知道自己在做什么时才使用


谢谢回复。我更愿意保持 PHP,因为整个应用程序都是用 PHP 编写的,但实际上这可能是更好的解决方案。这是 PHP 的一个巨大缺点。 :( - Adam Bertram
你好,我想问一下你是用什么方法来生成子进程的?是用 pcntl_fork()exec('php script.php > /dev/null &'); 还是其他我现在想不到的方法? - DaveRandom
我还没有想出一个明确的解决方案。但是,我的想法是使用exec函数。 - Adam Bertram

1

我从未听说过 HTTPRequestPool 类。谢谢!然而,通过这个我可以想出如何发送异步 HTTP 请求,但我还需要单独处理每个请求所获取的结果。这可行吗? - Adam Bertram
我相信是这样的。你看过文档了吗?特别是要查看“getFinishedRequests”方法--http://www.php.net/manual/en/function.httprequestpool-getfinishedrequests.php - rICh

0
我最终使用了passthru函数并将脚本传递到后台。到目前为止,情况似乎很好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接