【问题标题】:Processing a large amount of data using jobs in php使用php中的作业处理大量数据
【发布时间】:2013-03-20 22:57:48
【问题描述】:

我们有一个网站,上面有“项目”,每个项目的订阅人数都给定。

在项目“结束”时,会收集并处理所有订阅者。在这种情况下,大约有 1,000 个订阅者的数据需要被提取和处理。还有一些相关数据与每个数据集一起存储在一个数组中。

上次我们处理大订单时,大约 300 件商品,PHP 内存不足。我们提升了内存,它能够处理它。我认为这次不会是这样。

我们目前使用拉动项目的作业来处理订阅者。在此作业中,执行 SQL 查询以拉取所有“订阅者”并将它们及其相关数据存储在数组中。然后迭代该数组以创建单独的作业来处理各个订阅者。

我的问题是:

有没有办法在“块”或其他东西中做到这一点?或者有什么更好的方法可以减少对记忆的影响?如果我们有成千上万的订阅者,我希望它可以扩展。

现在是这样的流程:

  • 项目“结束”
  • 作业开始设置一些标志,并拉动所有订阅者
  • 循环来自 MySQL(订阅者)的数据数组,并为每个订阅者创建一个单独的作业。
  • 每个订阅者作业都由引擎处理。

我只是很难确定执行此操作的最佳流程。

【问题讨论】:

  • 时间不紧迫。
  • 你需要把用户分成几部分。只需编写一个处理少量用户的脚本,将其添加到 cron 并安排它像晚上每小时一样(或者如果不需要那么长时间,则更快)。该脚本在数据库中写入,某个用户已经被处理,因此下一个查询(一个小时后)将处理下一个“数据包”用户。

标签: php cron jobs data-processing


【解决方案1】:

我会使用按 int-key 排序的主 RS, 并且只处理 一个 订阅者。

在部分作业结束时,保存已完成作业的 ID。如果您完成与否,在最后的回声中, 并有一个父脚本调用它:

在进程脚本的末尾添加一个睡眠以让其他玩家进入..

 while(file_get_contents('http://yourscript.php') != false);

(不使用包含会增加开销,但可以避免内存泄漏)

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2013-08-24
    • 1970-01-01
    相关资源
    最近更新 更多