我正在使用Laravel Queue和数据库驱动程序来延迟某些任务。
但是,由于某些原因,我无法运行设计好的工作程序。取而代之的是,我决定使用调度程序每5分钟给自己的工作人员打电话。
但是,我不能真正理解如何实现工作程序,也无法完全理解原始代码。我想从数据库中检索到期的作业并运行它们。该怎么做?
是否有一些可以正常加载作业的通用模型,例如DatabaseJob::whereDate(......)->get()
?
我是否必须为工作加载某些东西(有效载荷?),或者它会自动发生?我需要执行哪些方法?处理?火?还是其他?
答案 0 :(得分:1)
您可以为队列作业监视参考链接设置地平线:
https://laravel.com/docs/5.7/horizon
或者运行Artisan cmd
php artisan queue:listen database --queue=high
答案 1 :(得分:1)
您可以使用Artisan外观上的call()
方法从代码中运行artisan命令。例如,这将处理默认队列中的所有就绪作业,并在完成后退出:
Artisan::call('queue:work', ['--stop-when-empty' => true])
来自docs:
有时您可能希望在 CLI。例如,您可能希望从路线触发Artisan命令 或控制器。您可以在Artisan立面上使用
call
方法 完成这个。call
方法接受命令名称或 类作为第一个参数,命令参数数组作为 第二个论点。退出代码将返回: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