5

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

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

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

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

4

3 回答 3

2

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

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

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

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

1编辑 03/2013:PHP 现在可以是多线程的,但不建议将其用于生产,因为pthreads扩展仍然非常不稳定,也不建议普通用户使用,只有在你真的知道自己在做什么的情况下才使用它

于 2011-10-17T14:26:21.057 回答
1

同意 DaveRandom,查看 HTTP 请求池的实现,而不是滚动你自己的http://www.php.net/manual/en/class.httprequestpool.php

于 2011-10-23T07:54:05.827 回答
0

我最终使用 passthru 并将脚本传递到后台。到目前为止,事情似乎进展顺利。

于 2011-11-10T18:38:26.093 回答