如何从队列中执行作业?

How to execute a job from queue?

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

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

然而,我并不能真正理解如何实现工人,我自己也不能完全理解原始代码。我想从数据库中检索到期的作业并 运行 它们。怎么做?

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

我是否必须为作业加载某些东西(有效负载?),还是会自动加载?我需要哪些方法来执行作业?处理?火?或者别的什么?

队列作业监控可以设置horizo​​n参考link:

https://laravel.com/docs/5.7/horizon

或运行 Artisan 前 cmd

php artisan queue:listen database --queue=high

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

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

来自docs

Sometimes you may wish to execute an Artisan command outside of the CLI. For example, you may wish to fire an Artisan command from a route or controller. You may use the call method on the Artisan facade to accomplish this. The call method accepts either the command's name or class as the first argument, and an array of command parameters as the second argument. The exit code will be returned:

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

    // });

相同的语法适用于 scheduling:

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

正如其他人指出的那样,运行将工作人员置于 schedule:run 内部可能会导致意外行为,例如跳过预定任务。

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