laravel - 如何从队列中执行作业?
问题描述
我正在使用 Laravel Queue 和数据库驱动程序来延迟一些任务。
但是,由于某些原因,我无法运行设计的工人。相反,我决定使用调度程序每 5 分钟调用一次我自己的工作人员。
但是,我无法真正理解如何实现 worker,我自己也无法完全理解原始代码。我想从数据库中检索到期的作业并运行它们。怎么做?
是否有一些通用模型可以正确加载它们DatabaseJob::whereDate(......)->get()
?
我必须为工作加载一些东西(有效负载?)还是会自动发生?我需要哪些方法来执行这项工作?处理?火?或者是其他东西?
解决方案
call()
您可以使用Artisan 外观上的方法从代码中运行 artisan 命令。例如,这将处理默认队列中的所有就绪作业,并在完成后退出:
Artisan::call('queue:work', ['--stop-when-empty' => true])
从文档:
有时您可能希望在 CLI 之外执行 Artisan 命令。例如,您可能希望从路由或控制器触发 Artisan 命令。您可以使用
call
Artisan 外观上的方法来完成此操作。该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
推荐阅读
- twilio - 带有 Whatsapp 错误消息顺序的 Twilio Autopilot
- c++ - 为什么这种递归 DFS 比使用堆栈的算法快得多?
- ios - Apple 在 Nativescript-app 中的 «do not track»
- python - 使用 selenium 和 webdriver 打开空白网页
- react-native - React Native 视频通话通知
- javascript - Javascript - 生成随机柔和的 HEX/RGBA 颜色
- javascript - 比较两张工作表并附加新数据
- azure - 当 Microsoft Bot 处理任何请求时显示“TypingIndicator”
- android - 使用 Google 应用操作收集数据以扩展应用功能
- ocaml - 如何在 OCaml 中实现没有“else”的“if”?