我创建了一个电子邮件队列数据库表。我将把我的PHP应用程序需要发送的所有电子邮件插入此表。
然后,另一个PHP脚本将查找所有未发送的电子邮件并将其发送。
我使用cronjobs运行此脚本。不幸的是,cronjobs每分钟最多只能运行一次。因此,在最坏的情况下,用户必须等待一分钟,直到真正发送他的电子邮件为止。
我目前的解决方法是,使用附加的sleep参数调用脚本并复制cronjobs。
例:
* * * * * curl emails.php?sleep=0 >/dev/null 2>&1 * * * * * curl emails.php?sleep=10 >/dev/null 2>&1 * * * * * curl emails.php?sleep=20 >/dev/null 2>&1 * * * * * curl emails.php?sleep=30 >/dev/null 2>&1 * * * * * curl emails.php?sleep=40 >/dev/null 2>&1 * * * * * curl emails.php?sleep=50 >/dev/null 2>&1
在上面的示例中,脚本每10秒运行一次。emails.php脚本的第一行是:
sleep($_REQUEST['sleep']);
对于初学者,我建议使用命令行版本的PHP,而不要使用curl来调用脚本。然后,您可以创建一个具有合理使用寿命的PHP脚本,该脚本不受必须在给定时间段内输出响应的限制。
这样,您就可以在PHP脚本中简单地hibernate/检查电子邮件/传输/hibernate等,而不用不必要地使用cron。
此外,我会确保通过使用pid文件或数据库设置方法来确保不在数据库表上同时运行多个PHP脚本(如果存在/设置了给定的文件/设置,则终止处理) ),或者通过在开始周期的“检查电子邮件”部分之前检查脚本运行了多长时间,合理地安排cron作业的时间并限制脚本的最大处理时间。