我有这样的时间表:
<?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')
。
这是最好的方法吗?
答案 0 :(得分:1)
如果您只想运行计划作业,只需在`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
来运行异步任务,您可以安装supervisor
保持queue:work
始终运行。
请参见this doc并配置queue:work
和supervisor
,然后使用计划任务将作业分派到队列中。修改app/console/kernel.php
:
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
// Do something
App\MyScheduleJob::dispatch();
})->daily();
}
现在,队列应该一直在运行,并且调度作业可以每天调度到队列中。
答案 1 :(得分:1)
我想写一个很长的答案并给出解释。
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文档的supervisor configuration部分。
如果您坚持要同时使用cron
和queue workers
,请使用queue:work --once
让您的工作人员知道何时停止:)
答案 2 :(得分:1)
根据文档https://laravel.com/docs/5.8/scheduling#scheduling-queued-jobs
您可以通过以下方式简单地将作业排队:
$schedule->job(new Heartbeat)->everyFiveMinutes();
答案 3 :(得分:1)
您的队列工作程序应该独立运行。您应该使用超级用户来确保它保持运行。但是,如果必须从调度程序启动队列工作器,则最好使用queue:work --stop-when-empty