[英]Laravel 5 Run queue:work on laravel schedule
我有这样的时间表:
<?php
namespace App\Console;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Console\Scheduling\Schedule;
protected function schedule(Schedule $schedule)
{
Artisan::call('queue:work');
}
我在我的cronjob上添加了这个:
* * * * * cd /var/www/html/my_script_address && php artisan schedule:run
它是正确的代码吗? 我问,因为每分钟运行Artisan::call('queue:work')
。
这是最好的方法吗?
如果您只想运行计划作业,只需在app / console / kernel.php中编写:
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
// Do something
DB::table('recent_users')->delete();
})->daily();
}
并将以下代码放入/etc/cron.d/laravel-project
:
* * * * * cd /path/to/laravel-project-root && php artisan schedule:run >> /dev/null 2>&1
参见: https : //laravel.com/docs/5.7/scheduling#introduction
Queue
是提供运行异步任务的,您可以安装主管以保持queue:work
始终在运行。
请参阅此文档并配置queue:work
和supervisor
,并使用schedule任务将您的作业调度到队列中。 修改app/console/kernel.php
:
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
// Do something
App\MyScheduleJob::dispatch();
})->daily();
}
现在,队列应始终在运行,并且调度作业可以每天调度到队列中。
我想写一个很长的答案并作解释。
1- Crontab是一个计划的工作经理。 每当调度程序计时时,它都会调用您的命令。
例如:如果您创建一个crontab条目以每分钟写一次hello world,它将每分钟执行一次,直到永恒。
2-队列工作者侦听队列,如果有任何等待完成的工作,它将起作用。 与cron作业非常相似,但是执行时间未预定义。 自己看看:
/**
* Listen to the given queue in a loop.
*
* @param string $connectionName
* @param string $queue
* @param \Illuminate\Queue\WorkerOptions $options
* @return void
*/
public function daemon($connectionName, $queue, WorkerOptions $options)
{
// [...]
while (true) {
...
}
}
如您所见,她一直持续到外界的某种事物阻止了她。
4-您的调度程序将每分钟再创建一个这样的工作程序。
使用诸如supervisor
东西来监视您的工人。 并认真创建您的工作人员实例。 请参阅laravel文档中的超级用户配置部分。
如果您坚持要同时使用cron
和queue workers
,请使用queue:work --once
让您的员工知道何时停止:)
根据文档https://laravel.com/docs/5.8/scheduling#scheduling-queued-jobs
您可以通过以下方法简单地将作业排队:
$schedule->job(new Heartbeat)->everyFiveMinutes();
您的队列工作者应该独立运行。 您应该使用超级用户来确保它保持运行。 但是,如果必须从调度程序启动队列工作器,则最好使用queue:work --stop-when-empty
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.