每天,cron作业都会执行PHP脚本,以向订阅者发送电子邮件。
该脚本可以正常工作,但是问题在于订阅者增加了,并且该脚本在100秒后超时。
所以我需要分批运行流程。
我的问题:如何让脚本从某个ID开始,然后下次从该ID开始?我无法将脚本分为不同的文件,因为我不知道有多少个订阅者。
/* Get all subscribers from DB */
$stmt = $pdo->query("SELECT * FROM subscribers");
/* Loop through subscribers and get email */
foreach(){
/* Create a new PHPMailer object. */
$mail = new PHPMailer();
/* Set the mail sender. */
$mail->setFrom('[email protected]', 'John Doe');
/* Add a recipient. */
$mail->addAddress('[email protected]', 'recipient');
/* Set the subject. */
$mail->Subject = 'New article';
/* Set the mail message body. */
$mail->Body = 'This is a new article.';
/* Finally send the mail. */
if (!$mail->send())
{
/* PHPMailer error. */
echo $mail->ErrorInfo;
}
}
更新:
这些方法中的一种会起作用吗?
1-我不是使用一次获取所有订阅者
SELECT * FROM subscribers
的方法,而是使用循环每次获取500行,并且可能在每次之后使用sleep()
。/* Loop with increment of 500 */
for($i = 0; $i <= $rowsCount; $i += 500){
/* Select 500 subscribers */
$query = ("SELECT * FROM `subscribers` LIMIT $i, 500");
/* Send Emails to 500 subscribers */
sleep(60);
}
2-将最后一个订户ID保存在一个表中,每次执行脚本时,从该ID开始:
/* Get the last subscriber id from previous time */
$last_subscriber_id = `SELECT id FROM last_subscriber_id`;
/* Select the next 500 subscribers starting from the previous time last id */
$query = "SELECT * FROM `subscribers` WHERE `id` > $last_subscriber_id LIMIT 500";
/* Send Emails to 500 subscribers */
..
/* Update last_subscriber_id with the last id */
..
但是在这种情况下,我将每x分钟运行一次脚本,因为我不知道有多少个订户
而且我认为我无法使用PHP更新cron作业,因此,如果所有订阅者都收到了电子邮件,则停止执行该脚本。
最佳答案
我建议一些可能的方法。
一种是remove lines from the file as you process it
另一个方法是使用Kafka或RabbitMQ之类的系统异步执行此操作。
最后,您可以在持久性存储中记录要处理的行号,读取该行号,然后跳转到文件的该行。
关于php - 将大量消息发送给订阅者到时事通讯,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57415082/