Laravel 5运行队列:按laravel时间表进行工作

时间:2018-12-24 09:30:37

标签: php laravel laravel-5 laravel-queue laravel-scheduler

我有这样的时间表:

<?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')

这是最好的方法吗?

4 个答案:

答案 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:worksupervisor,然后使用计划任务将作业分派到队列中。修改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部分。

如果您坚持要同时使用cronqueue 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