我想限制从我的网站发送的电子邮件数量,以应对托管服务电子邮件的限制。 我正在使用cron作业和堆放数据库中的电子邮件的指示符来检查发送的电子邮件数量是否接近发送的最大电子邮件数量限制。是按顺序还是并行执行wordpress cron作业?
我这样做的方式是直接执行预定过程,然后在特定时间段(根据其在队列中的位置)进行“睡眠”,然后发送电子邮件并登录数据库。 为了进一步解释为什么我使用的计划任务和“睡觉”的原因,请考虑以下情况:
- 的用户尝试注册到我的网站,并希望电子邮件被/她不久寄给他。因此,如果电子邮件/分钟超出限额,我需要发送一条不同的信息:“我们的服务器正忙,请允许'x'分钟来执行所需的任务。
- 发送电子邮件的请求都是通过AJAX完成的。在流程本身中使用“睡眠”不是一种选择,因为用户将不得不等待x分钟,直到“繁忙消息”被回显。
- 我试着用ob_flush,flush ...等。组合来回应消息,然后服务器处理后台中的所有内容,但从未奏效。 AJAX调用总是等待脚本结束以回应结果。
我需要单线程PHP语言中的多线程!作为一种解决方法,我使用了cron作业,其中每个堆积电子邮件计划在
time()
(即直接启动计划作业)执行,并挂钩到发送电子邮件的相同功能。使用一个标志,函数知道该请求是一个堆积电子邮件,并使其“休眠”,直到电子邮件配额重置所需的时间。问题:如果5个人几乎同时注册(虽然我们还有一个电子邮件堆),但是我们有5个cron作业应该同时执行,然后睡一会儿(如果一堆电子邮件中的电子邮件数量已经大于电子邮件配额,则休眠时间可能会有所不同),然后发送电子邮件。但是,当我检查数据库中的日志时,发现预定作业是按顺序执行的,而不是并行执行的。有时候会发生一个cron工作在另一个结束之前被解雇,但他们并不同时解雇。
我知道WordPress的cron作业是不是真的cron作业和被解雇一旦有人访问该网站(和我确保我刷新注册请求后的页面发送给解雇所有的计划任务),但他们似乎是我的唯一选择,因为我的托管服务器不允许访问服务器,也不允许调度cron作业。
这里是执行上面的部分代码:
//Test example to pile up emails, where quota is set to 2 emails every 30 seconds
$Emails_Threshold = 2;
$Threshold_Duration = 0.5*60;
//Get email indicator info
$Email_Info = $wpdb->get_row(
"SELECT *
FROM PileEmails
WHERE priority = -1
AND Status='New';"
,ARRAY_A);
if ($sleep ==0 && $Queue_Info_id==0){ //Not a scheduled event
//Check if there are queued emails
$Queue_exist = $wpdb->get_row (
$wpdb->prepare("
SELECT Status
FROM PileEmails
WHERE Status='Queued';"
,$mail_priority)
,ARRAY_A);
if (!empty($Queue_exist) || ($Email_Info['last_email_time'] > (time()-$Threshold_Duration))){
if ($Email_Info['count_emails']>=$Emails_Threshold){
//Code to Pile up
}
}else{
//Reset email counter
}
}else{
$wpdb->insert("PileEmails",$Sleep_Info,$format);
sleep(10); //10 seconds here just as an example
}
//Code to send emails
这里是我所得到的记录到数据库中,当我尝试超出配额后,发送10封电子邮件。
注意,时间戳有每个日志和下面的一个,虽然他们都应该在同一时间被解雇,各睡10秒10秒之间的区别,那么所有并行发送电子邮件。
所以我的问题是:为什么wordpress cron按顺序触发预定的作业,而不是并行?以及如何克服这个问题?
任何帮助,非常感谢。
或许我应该指出的是,我在编译上面的代码中面临的一个WordPress的问题: 当你犯了一个WordPress的cron作业“睡眠”,这意味着每当有人在一次访问您的网站将再次执行它睡觉...即如果计划任务没有完成,wordpress会再次重新启动它,因为它仍然会看到cron作业。 我认为这是wordpress人应该修复的东西,没有人期望cron作业在非常接近的时间间隔内被执行超过一次。 –
显然,wordpress在他们的网站上说:“请注意,安排一个事件发生在同名现有事件10分钟之后才会被忽略,除非您将$ args的唯一值传递给每个预定事件。”意味着wordpress会不允许在10分钟内不止一次地“调度”相同的脚本,同时它也应该防止在一定的时间跨度内多次执行相同的脚本。 –
我会建议先安装一个cron管理插件,以便您可以轻松查看何时以及哪些cron正在发射,或者在此处创建您自己的https://developer.wordpress.org/plugins/cron/simple-testing/ –