通过延迟将循环过程分成几个部分,需要建议

发布于 2024-11-03 10:39:24 字数 526 浏览 1 评论 0原文

我想将一个流程(循环)分解为几个部分,例如,如果有 128 封电子邮件要发送:

function subs_emails(){    
    $subscribers = //find subscribers

    if(!empty($subscribers )){
        foreach($subscribers as $i => $subscriber){
            sendEmail($subscriber->id);
            if($i % 15 == 0){ //<-- send email per 15
                sleep(60); //to pause the process for 60 seconds 
            }
        }
        return true;
    }else{
        return false;
    }
}

这可行吗?或者还有其他“更好的方法”解决方案吗?需要建议,

谢谢

i wanted to break down a process (loop) into some parts, for example if have 128 emails to send :

function subs_emails(){    
    $subscribers = //find subscribers

    if(!empty($subscribers )){
        foreach($subscribers as $i => $subscriber){
            sendEmail($subscriber->id);
            if($i % 15 == 0){ //<-- send email per 15
                sleep(60); //to pause the process for 60 seconds 
            }
        }
        return true;
    }else{
        return false;
    }
}

will this works ?? or is there any other "better approach" solution ?? need advice please

thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

像极了他 2024-11-10 10:39:24

通常的方法是一次只发送几封电子邮件,并在后台标记已发送的电子邮件(例如通过数据库标志 send=1)

然后通过 cronjob 每隔几分钟调用一次脚本

这样您就不会遇到 php 问题向大量订阅者发送电子邮件时超时

The usual approach would be to send only a few emails at once and mark the sent ones on the background(via database flag sent=1 for example)

Then call the script every few minutes via a cronjob

This way you dont run into problems with php timeouts when sending emails to a lot of subscribers

怀里藏娇 2024-11-10 10:39:24

sleep() 将导致脚本停止定义的秒数(在您的示例中为 60 秒)。它不会真正打破循环,而只是延迟循环。

一种可能的解决方案是记下已向哪个订阅者发送电子邮件。然后,您可以通过 cron 定期执行脚本,并且仅加载少量尚未收到电子邮件的脚本。例如:

  1. 脚本每 10 分钟执行一次
  2. 加载尚未标记为已通知的 15 个订阅者
  3. 循环遍历所有 15 个加载的订阅者并向每个订阅
  4. 者发送一封电子邮件 在所有 15 个订阅者上设置标志以表示他们已收到电子邮件 脚本
  5. 将在 10 分钟后运行以进行处理接下来的 15 位订阅者

sleep() will cause the script to stall for the defined number of seconds (60 in your example). It won't really be breaking the loop but instead merely delaying it.

A possible solution is to make a note of which subscriber has already been sent an email. Then you can have your script execute at regular intervals via cron and only load a small amount of those who have not yet been sent an email. For example:

  1. Script executes every 10mins
  2. Load 15 subscribers who have not been flagged as already notified
  3. Loop through all 15 loaded subscribers and send each an email
  4. Set flag on all 15 to say they have been sent the email
  5. Script will then run 10mins later to process the next 15 subscribers
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文