2011-10-17 41 views
5

我正在研究一个应用程序,该应用程序主要使用PHP编写的利用亚马逊的MWS API。这个应用程序允许亚马逊卖家注册,提供一些亚马逊卖家的凭证,然后应用程序开始从亚马逊下载这个用户的订单,将它们放入MySQL数据库。什么是在PHP中运行异步函数的最有效方法?

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

我对PHP很陌生,特别是从它运行异步过程。我发现我可以做到这一点的唯一方法是拥有一个初始脚本,用于查找数据库中的所有用户,并为每个用户生成一个同步脚本,然后释放它。我不喜欢这个想法,因为如果我确实有500多个用户,我每晚同步将包含500个衍生的PHP脚本实例。

以前有没有人做过类似的事情?如果是这样,我很想听听如何更好地使此同步更有效。

回答

1

同意瓦特/ DaveRandom,检查HTTP请求池实施,而不是滚动您自己http://www.php.net/manual/en/class.httprequestpool.php

+0

我从来没有听说过HTTPRequestPool类,谢谢!但是,从这我可以弄清楚如何让它发送异步HTTP请求,但我也需要处理我分别从这些检索到的每个结果。这可以做到吗? –

+0

我相信如此。你有阅读文档吗?特别是检查“getFinishedRequests”方法 - http://www.php.net/manual/en/function.httprequestpool-getfinishedrequests.php – rICh

2

由于PHP不能多线程,在实践中你只有两个选择(有几种方法来做到这一点,但他们都归结为以下至类别):

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

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

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

编辑03/2013:PHP现在可以是多线程的,但其不推荐用于生产用途为pthreads扩展仍然十分不稳定,它也不会推荐给普通用户来说,只要使用此你真的知道你在做什么

+0

感谢您的回复。我宁愿将它保留在PHP中,因为整个应用程序都是用PHP编写的,但实际上这可能是更好的解决方案。这是PHP的一个巨大缺陷。 ( –

+0

)出于兴趣,你是如何产生子进程的?用'pcntl_fork()','exec('php script.php>/dev/null &');'或其他一些我现在无法想到的方法? – DaveRandom

+0

我还没有想出一个明确的解决方案,但是我的想法是使用exec函数 –

0

我结束了使用中继并通过脚本的背景。事情似乎迄今运作良好。

相关问题