【问题标题】:Good idea to run a PHP file for a few hours as cronjob?将 PHP 文件作为 cronjob 运行几个小时的好主意?
【发布时间】:2013-10-18 04:34:25
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 如果您的硬件负担得起并且您的进程没有耗尽内存 - 为什么不呢?
  • 点,仍然想知道或者这真的是要走的路,所以很好奇你的意见。
  • 与@LarsStegelitz 相同,但我建议您为最近成功的图像下载实施一个跟踪系统,以防万一发生崩溃,然后您知道它在哪里停止。这当然意味着在某个时间点,cron 作业会在早上之前自行重启。
  • 拆分工作不是一个坏主意(在失败的情况下会使流程更加健壮 - 但意味着代码和数据的额外开销)。取决于用例。
  • 许多选项,只有您知道最适合您的情况。但是对于 php,我的目标是至少与您拥有的内核一样多。

标签: php cron


【解决方案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 网站上有大量文档和示例,但如果您需要任何具体指导,我很乐意提供帮助。

【讨论】:

  • 感谢您的详细解释,对我帮助很大:) 我们已经实现了 cronjobs,一切运行顺利
  • 不客气!您是否在解决方案中使用了 Fat Controller?
  • 是的,就我们所经历的而言,它运作良好。在您的解释之后,我们首先寻找一个创建块的 shell 脚本解决方案(我们认为这将是一个更清洁的解决方案),但这似乎并不那么容易开发。相比之下,胖控制器是! :)
【解决方案2】:

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

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

【讨论】:

  • 可以更快地解析 JSON,但是您不能像 XML-s 那样流式解析 json,如果您有 1-2 GB 的 json,您将耗尽内存,仅用于打开它变成一个对象。
猜你喜欢
  • 2020-05-26
  • 1970-01-01
  • 2015-06-28
  • 2013-10-16
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
相关资源
最近更新 更多