【问题标题】:How to effectively execute this cron job?如何有效地执行这个 cron 作业?
【发布时间】:2010-05-11 17:50:07
【问题描述】:

我有一个有 200 行的表。我每 10 分钟运行一次 cron 作业以对表执行某种插入/更新操作。每次运行 cron 作业时,一次只需要对 5 行执行该操作。所以在前 10 分钟更新记录 1-5,在第 20 分钟更新记录 5-10,依此类推。

当 cron 作业第 20 次运行时,表中的所有记录将恰好更新一次。这是至少要达到的。下一个 cron 作业应该再次重复该过程。

问题: 也就是说,每次运行 cron 作业时,都应该在 N 行(不仅仅是 5 行)上执行插入/更新操作。因此,如果 N 为 100,则所有记录将仅由 2 个 cron 作业更新。下一个 cron 作业将再次重复该过程。

这是一个例子:

这是我目前拥有的表(200 条记录)。每次执行 cron 作业时,它都需要选择 N 记录(我在 PHP 中将其设置为变量)并使用当前时间的 MD5 值更新 time_md5 字段。

+---------+-------------------------------------+ 
|      id | time_md5                            | 
+---------+-------------------------------------+ 
|      10 | 971324428e62dd6832a2778582559977    |  
|      72 | 1bd58291594543a8cc239d99843a846c    |  
|       3 | 9300278bc5f114a290f6ed917ee93736    |  
|      40 | 915bf1c5a1f13404add6612ec452e644    |  
|     599 | 799671e31d5350ff405c8016a38c74eb    |  
|      56 | 56302bb119f1d03db3c9093caf98c735    |  
|     798 | 47889aa559636b5512436776afd6ba56    | 
|       8 | 85fdc72d3b51f0b8b356eceac710df14    |     
|      .. | .......                             |     
|      .. | .......                             |     
|      .. | .......                             |     
|      .. | .......                             |     
|     340 | 9217eab5adcc47b365b2e00bbdcc011a    |  <-- 200th record   
+---------+-------------------------------------+ 

因此,第一条记录(id 10)不应该更新一次以上,直到所有 200 条记录都更新一次 - 一旦所有记录都更新一次,该过程应该重新开始。

我对如何实现这一点有一些想法,但我确信有更有效的方法可以做到这一点。

有什么建议吗?

【问题讨论】:

  • 你的更新机制是cron执行的PHP脚本吗?
  • 是的,它是一个 PHP 脚本 + mySQL。

标签: php cron


【解决方案1】:

您可以使用红/黑系统(例如用于集群管理)。

基本上,所有行都以黑色开始。当你运行你的 cron 时,它会将它更新的行标记为“红色”。一旦所有的行都是红色的,你切换,现在开始把所有的红色行变成黑色。你继续这种交替,它应该允许你有效地标记行,这样你就不会更新它们两次。 (您可以将所需的任何颜色目标存储在文件中或其他内容中,以便在 cron 之间共享)

【讨论】:

  • 我有点想在没有任何额外文件的情况下执行此操作,因为可能有几十个相同的 PHP 脚本正在运行 - 只有变量 N 会在每个 cron 作业中更改。
  • 您希望多个脚本同时修改同一个数据集?
  • 不,每个 cron 作业都会更新一个范围内的记录。在我的实际表中,每个 cron 都将处理任何特定年份的记录。因此将有 5 个 crons 分别处理 2000 年、01、02、03、04 和 05 年的记录。
  • 啊,我想您可以将红/黑标记存储在另一个表中以避免写入任何文件?
  • 我已经适应了某种红/黑系统。
【解决方案2】:

我会使用 cron 每 10/5 分钟运行一次 PHP 脚本,然后使用 PHP 的时间和日期函数来执行其余的逻辑。如果无法计时,可以将位置标记变量存储在一个小文件中。

【讨论】:

    猜你喜欢
    • 2019-05-02
    • 2015-04-24
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多