【问题标题】:how to run the jobs queue immediately after a job added to queue in laravel?如何在将作业添加到 laravel 中的队列后立即运行作业队列?
【发布时间】:2022-08-20 16:06:10
【问题描述】:

我目前在cpanel的cronjob中注册了php artisan schedule:run,调度方法是:

protected function schedule(Schedule $schedule)
{
    $schedule->command(\'queue:work --stop-when-empty\')
    ->cron(\'* * * * *\')
    ->withoutOverlapping(5);
}

但出于我的目的,有必要立即运行这些作业,

如何在将作业添加到队列(作业表)而不是在一分钟后立即运行php artisan queue:work

  • 将队列作为 cron 作业启动而不停止它。
  • 在这种情况下,物理内存使用率达到 100% 并给出分配内存错误。
  • 所以如果停止队列修复它,你就会有内存泄漏。纠正那个。

标签: php laravel laravel-queue laravel-jobs


【解决方案1】:

对于 Laravel > 7.x 我们可以匿名发送

use App\Mail\WelcomeMessage;
use Illuminate\Support\Facades\Mail;
 
dispatch(function () {
    Mail::to('taylor@laravel.com')->send(new WelcomeMessage);
})->afterResponse();

WelcomeMessage 应该实现/使用 Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

对于 Laravel 6.x
除了将作业类分派到队列之外,您还可以分派一个闭包。这对于需要在当前请求周期之外执行的快速、简单的任务非常有用:

$podcast = App\Podcast::find(1);
 
dispatch(function () use ($podcast) {
    $podcast->publish();
});

有关更多信息,您可以阅读 laravel 文档https://laravel.com/docs/7.x/queues

【讨论】:

    【解决方案2】:

    解决方案是在我想立即运行它的每个类的 destruct() 方法上调用queue:work

    use Illuminate\Support\Facades\Artisan;
    
    public function __destruct()
    {
        Artisan::call('queue:work --stop-when-empty');
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-02
      • 1970-01-01
      • 2017-01-14
      • 2016-09-01
      • 2021-01-05
      • 1970-01-01
      • 2018-07-15
      • 2020-01-02
      • 2017-05-11
      相关资源
      最近更新 更多