【问题标题】:How to make sure a php script never runs twice如何确保一个 php 脚本永远不会运行两次
【发布时间】:2014-04-12 15:05:47
【问题描述】:

我正在制作一个 php 邮件程序,它从 javascript 应用程序 xmlhttp 请求中获取 POST 数据。

它适用于大约 50 个联系人,但我只是在 150 个测试电子邮件地址上对其进行了测试,并且在脚本中途达到了最大执行时间(因为我在发送每封邮件后都设置了延迟),然后它自动重新启动脚本相同的数据并从第一个联系人开始发送邮件。

我担心它会无限循环,但在第二次运行达到最大执行时间后它停止了。我在第二次运行期间关闭了 javascript 应用程序,所以可能与它停止有关。

我将要么增加最大执行时间,要么改为解析 php 数据块,但我需要确保这种情况永远不会再次发生,因为在现实世界的运行中,我永远无法将两封电子邮件发送到同一个人。

是否还有其他情况下 php 脚本可能会运行两次,并且是否有可靠的方法来确保它永远不会发生?

【问题讨论】:

  • 这是一个比看起来复杂得多的问题。您需要跟踪它上次运行的时间,和/或它最后一次向某人发送电子邮件的时间,并且当您执行时,请检查以确保它在过去 X 小时内没有运行,或者没有t 之前发送给那个人(或在过去 X 小时内没有发送给他们)。
  • 你考虑过使用 Swiftmailer 吗?发送这么多邮件应该没有问题。
  • 是否还有其他可能导致 php 脚本运行两次的情况;是的,如果你运行它两次。您需要检查脚本运行两次的原因。
  • @cale_b,啊,我明白了,好主意。我已经建立了一个日志系统,所以我可以使用它。
  • @SalmanA,我能想到脚本运行两次的唯一原因可能是因为兑现了 POST 数据?我不确定它是如何工作的,也许当脚本由于最大执行时间而失败时,服务器使用兑现的 POST 数据再次运行它。它是共享主机,所以我不确定。

标签: javascript php


【解决方案1】:

如果您从文件中读取邮件,则需要将其从文件中删除或将已发送邮件列出并与源列表进行比较。 此外,最好使用带有 id、target、sent(true/false)、datetime 等列的数据库,并在邮件成功发送后更新它

【讨论】:

    【解决方案2】:

    我假设您的电子邮件地址在某种数据库中,因此答案相当简单。

    将另一个常见的 DATETIME 添加到您的表中,并在每次脚本向该联系人发送电子邮件时更新它。

    就在您发送电子邮件之前,获取该印章并将其与人类值、先前和当前消息的 DATETIME 进行比较。如果最后一条消息是在最近一条消息发出之后发送的,则不要发送它。

    如果我假设没有数据库是错误的……我强烈建议您获取数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 2012-01-08
      • 2018-11-18
      • 2011-04-27
      • 2011-09-22
      • 1970-01-01
      • 2016-12-21
      相关资源
      最近更新 更多