1

我想每晚将 PHP 脚本作为 cronjob 运行。PHP 脚本将导入一个包含大约 145.000 个产品的 XML 文件。每个产品都包含一个图像链接,该图像也将被下载并保存在服务器上。我可以想象这可能会导致一些过载。所以我的问题是:拆分 PHP 文件是否更好?如果是这样,什么是更好的解决方案?更多的 cronjobs,彼此之间有几分钟的暂停?使用 exec 运行另一个 PHP 文件(猜不是,因为我无法想象这会产生很大的不同),或者其他什么......?还是只使用一个脚本一次导入所有产品?

提前致谢。

4

2 回答 2

1

这在很大程度上取决于您是如何编写它的,它是否不会泄漏打开的文件或数据库连接。它还取决于您使用的 php 版本。在 php 5.3 中,为解决垃圾收集问题做了很多工作:

http://www.php.net/manual/en/features.gc.performance-considerations.php

如果操作是事务性的并不重要,即全有或全无(例如,如果它在中途失败),那么我很想分块解决这个问题,每次运行脚本处理下一个 x 项,其中 x 可以是一个变量,取决于它需要多长时间。所以你需要做的是继续重复脚本,直到什么都不做。

为此,我建议使用名为 Fat Controller 的工具:

http://fat-controller.sourceforge.net

它可以继续重复脚本,然后在一切完成后停止。您可以告诉 Fat Controller 还有更多工作要做,或者使用 php 脚本的退出状态完成所有操作。Fat Controller 网站上有一些用例,例如: http: //fat-controller.sourceforge.net/use-cases.html#generating-newsletters

您还可以使用 Fat Controller 并行运行进程以加快速度,但请注意不要并行运行太多并减慢速度。如果您正在写入数据库,那么最终您将受到硬盘的限制,除非您有一些花哨的东西,否则您的最佳并发性将是 1。

最后一个问题是如何触发它——你最好从 CRON 触发 Fat Controller。

Fat Controller 网站上有大量文档和示例,但如果您需要任何具体指导,我很乐意提供帮助。

于 2013-10-17T20:10:23.293 回答
1

要完成上一个答案,最好的解决方案是优化您的脚本:

  • 更喜欢 JSON 而不是 XML,解析 JSON 更快(非常)。
  • 使用一个或几个并发连接到数据库。
  • 一次更改多行(一次查询插入10-30行,选择100行,删除多行,不多不超载内存,不少让您的交易有利可图)。
  • 尽量减少查询次数。(根据上一点)
  • 明确地跳过最新的行,使用日期(时间戳,日期时间)。
  • 您还可以通过 usleep(30) 调用让 proc 耳语。
  • 要使用多个 PHP 进程,请使用popen()
于 2013-10-17T20:34:25.310 回答