我正在开发一个应用程序,该应用程序利用主要用 PHP 编写的亚马逊 MWS API。此应用程序允许亚马逊卖家注册,提供一些亚马逊卖家凭据,然后该应用程序开始从亚马逊下载该用户的订单,并将其放入 MySQL 数据库中。
我已经使用具有多种功能的脚本构建了将数据准确同步到数据库的方法,但我注意到这花费的时间太长了。该脚本简单地遍历数据库中的所有用户并一次迭代所有订单。现在,只有 5 个测试用户,时间是可行的,但我正在寻找一种更具扩展性的方法。想想 500 个用户一次一个同步运行。太长了!
我对 PHP 很陌生,尤其是从它运行异步进程。我发现我能做到这一点的唯一方法是有一个启动脚本,它可以找到数据库中的所有用户,并为每个用户生成一个同步脚本,然后发布它。我不喜欢这个想法,因为如果我确实有 500 多个用户,我的夜间同步将包含此 PHP 脚本的 500 个派生实例。
有没有人做过类似的事情?如果是这样,我很想听听如何最好地使这种同步更有效。
最佳答案
由于 PHP 不能多线程1,实际上你只有两种选择(有几种方法可以做到这一点,但它们都归结为以下类别):
- 每个用户操作有 1 个进程。正如您所说,对于大型数据库,这可能会导致很多进程。
- 拥有处理多个用户的流程。这可能需要更长的时间,因为每个进程实际上都是同步的。
我认为最好的办法是结合这两种方法,这样你就有了处理多个用户的多个进程。因此,如果您有 500 个用户,则生成 100 个进程,每个进程处理 5 个用户,或者生成 50 个进程,每个进程处理 10 个用户。
或者,可能值得使用更适合该任务的语言编写程序 - 支持多线程的语言,如 Java 或 Perl - 如果需要,您可以从 PHP 开始。
1编辑 03/2013:PHP 现在可以是多线程的,但不建议将其用于生产,因为 pthreads扩展仍然非常不稳定,也不建议普通用户使用它,只有当你真的知道自己在做什么时才使用它
关于php - 在 PHP 中运行异步函数的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7794593/