【问题标题】:Making operations atomic without using max_execution_time不使用 max_execution_time 使操作原子化
【发布时间】:2012-10-03 14:09:23
【问题描述】:

我已经设置了一个 cron 作业(PHP 脚本),它执行以下工作:

1. Read all of the unseen emails, using imap
   1.1  For each email readed
   1.2. Fetches the details and save detail in database
   1.3. Moves email to other mailbox named "Processed"
   1.4. Goto step 1.1

但如果 PHP 脚本停止或失败执行,在步骤 1.2 之后但在 1.3 之前,电子邮件将被重新处理,这是问题

众所周知,处理时间取决于服务器负载和要处理的电子邮件数量等许多因素,所以我认为设置 max_execution_time 不会有帮助。

如何使这个原子化?有任何想法吗? (如果您对不同的流程有任何想法,我也可以更改流程)。

编辑:假设电子邮件移动了,它正要提交,但 PHP 脚本停止了?然后会发生的是电子邮件会在没有存储记录的情况下移动。

【问题讨论】:

    标签: php mysql algorithm atomic


    【解决方案1】:

    您可以将步骤 1.2 放入数据库事务中,然后如果步骤 1.3 失败,您将回滚该事务。

    如果您有一个事务,并且没有显式调用“提交”(即通过超时,或者您只是忘记调用提交),那么它会自动假定为回滚。

    【讨论】:

    • 但是“移动邮件”不是数据库操作。那将如何回滚?并且当下次执行脚本时,它不会知道上次发生的事情......
    • 你是说电子邮件被移动了,但 PHP 在收到移动完成通知之前就死了?
    • 但是假设电子邮件移动了,它只是要提交,但是 php 脚本停止了?现在会发生的是,电子邮件移动但没有存储记录
    • 您可能需要从 1.2 存储“待处理”状态,然后在下次程序运行时,它会检查“待处理”状态以查看它们是否移动。您不需要为此进行交易。
    猜你喜欢
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多