我开发了一个 PHP 脚本,希望能够自动向用户发送邮件。我成功地使用 PHP 脚本实现了一个 cron 作业,该脚本会检查 PHP 邮件队列表中的待处理邮件。该脚本运行正常,但 cron 作业运行异常:它会向用户发送邮件,但每次只发送 3 或 4 封。我只想发送一次邮件。我该如何实现?
我使用条件来检查邮件是否已发送,如果为 0,则将发送邮件并将值更新为 1。此条件工作正常。此外,相关数据库仅显示每个用户一个条目,因此从逻辑上讲,应该只向用户发送一封电子邮件,但 cron 作业却一次向用户发送 3 或 4 封相同的电子邮件。
我设置了每2分钟执行一次的cron job,命令如下:
2 * * * * wget (Http PATH to SERVER)/Utils/MailQueue.php
答案1
如果你认为你的脚本的多个实例可能同时运行,那么可以使用某种形式的锁定机制。将你的 wget 放入脚本中,并将其包装在群命令
2 * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/wgetscript
如果 MailQueue.php 脚本与你运行 cron 的机器相同,则不需要 wget
2 * * * * /usr/bin/flock -n /tmp/myAppLock.lck /usr/bin/php /path/to/Utils/MailQueue.php
这可能是一个更好的解决方案,因为它可以在没有您的网络服务器的情况下工作。