【问题标题】:Queue notifications delay in LaravelLaravel 中的队列通知延迟
【发布时间】:2021-07-05 12:51:03
【问题描述】:

我尝试使用 Laravel 队列延迟每个通知(或作业)。尽管如此,不是通知一个接一个地延迟,而是一次将延迟应用于所有通知。但是,延迟只应用于第一个通知,其余的作为第一条消息同时发送出去。请问,这个社区中的任何人都可以帮助我吗?

这是仅获取录取被接受或拒绝的申请人然后单独通知他们的方法的一部分。不幸的是,我们使用的邮件服务器每 1 分钟最多只能发送 30 封电子邮件;因此,我需要使用排队来限制每 2 秒仅发送(不超过)1 封电子邮件。

foreach ($applications as $application) 
{
    $application_id = $application->id;
    $admission = Admission::where('application_id', $application_id)->first();
    if (empty($admission->admission_no) & $application->status === 5) {
        $this->generateAdmissionNumber($application->id, $application->course_id);
        $application->update(['done' => 1]);
        $admissions = Admission::where('course_id', '=', $id)->get();
        foreach ($admissions as $admission) {
            $admission->update(['done' => 1]);
        }
    }
    $application->done = 1;
    $application->update();

    $user = $application->users;
    if ($user->notify_if_decision_is_made === 1) 
    {
        $user->notify((new DecisionNotification($user))
            ->delay(Carbon::now()->addSeconds(2)));
    }
}

我关注了guides,但仍然没有解决方案。我在这里查看了许多解决方案,但没有看到像这样的任何问题。

我在我的 .env 文件中设置了QUEUE_CONNECTION=database,在 DecisionNotification 文件中添加了shouldQueue,然后从终端运行php artisan queue:work 来执行作业。感谢您的帮助。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    ->delay() 只会延迟正在运行的作业。由于您的循环几乎立即运行,因此不会延迟,每个作业之间会延迟 2 秒。

    实现您想要的一种方法是:

    foreach ($applications as $i => $application) {
       // your code chunk
    
       $user->notify((new DecisionNotification($user))->delay($i * 2)));
    }
    

    这会导致延迟:

    Job 1: 0s
    Job 2: 2s
    Job 3: 4s
    Job 4: 6s
    Job 5: 8s
    ...
    

    顺便说一句,->delay() 也接受整数作为秒数。

    【讨论】:

      【解决方案2】:

      您可以使用sleep() 函数,该函数将循环保持定义的时间段,例如,如果您想保持循环2 秒,请使用sleep(2)

      你的代码应该是:

      foreach ($applications as $application) {
                  $application_id = $application->id;
                  $admission = Admission::where('application_id', $application_id)->first();
                  if (empty($admission->admission_no) & $application->status === 5) {
                      $this->generateAdmissionNumber($application->id, $application->course_id);
                      $application->update(['done' => 1]);
      
                      $admissions = Admission::where('course_id', '=', $id)->get();
                      foreach ($admissions as $admission) {
                          $admission->update(['done' => 1]);
                      }
                  }
                  $application->done = 1;
                  $application->update();
                  $user = $application->users;
                  if ($user->notify_if_decision_is_made === 1) {
                      $user->notify((new DecisionNotification($user))->delay(Carbon::now()->addSeconds(2)));
                  }
                 sleep(2);
              }
      

      希望这会有用。

      Read More about sleep()

      【讨论】:

      • 是的,这真的很有帮助。谢谢
      • 这个真的对我有用,而不是另一个答案......谢谢
      猜你喜欢
      • 2018-07-25
      • 2019-01-30
      • 2021-07-12
      • 2015-09-30
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      相关资源
      最近更新 更多