首页 > 解决方案 > 如何从队列中执行作业?

问题描述

我正在使用 Laravel Queue 和数据库驱动程序来延迟一些任务。

但是,由于某些原因,我无法运行设计的工人。相反,我决定使用调度程序每 5 分钟调用一次我自己的工作人员。

但是,我无法真正理解如何实现 worker,我自己也无法完全理解原始代码。我想从数据库中检索到期的作业并运行它们。怎么做?

是否有一些通用模型可以正确加载它们DatabaseJob::whereDate(......)->get()

我必须为工作加载一些东西(有效负载?)还是会自动发生?我需要哪些方法来执行这项工作?处理?火?或者是其他东西?

标签: laravellaravel-queue

解决方案


call()您可以使用Artisan 外观上的方法从代码中运行 artisan 命令。例如,这将处理默认队列中的所有就绪作业,并在完成后退出:

Artisan::call('queue:work', ['--stop-when-empty' => true])

文档

有时您可能希望在 CLI 之外执行 Artisan 命令。例如,您可能希望从路由或控制器触发 Artisan 命令。您可以使用callArtisan 外观上的方法来完成此操作。该call方法接受命令的名称或类作为第一个参数,以及一个命令参数数组作为第二个参数。将返回退出代码:

Route::get('/foo', function () {
    $exitCode = Artisan::call('email:send', [
        'user' => 1, '--queue' => 'default'
    ]);

    // });

相同的语法适用于调度

$schedule->command('queue:work', [...])->everyFiveMinutes();

正如其他人指出的那样,在内部 schedule:run运行工作程序可能会导致不良行为,例如跳过计划任务。

关于调度和运行排队作业如何工作的问题,这是开始的地方:https ://laravel.com/docs/5.7/queues


推荐阅读