3

我有这样的时间表:

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

4 回答 4

6

您的队列工作者应该独立运行。您应该使用主管来确保它保持运行。但是,如果您必须从调度程序启动队列工作程序,最好使用queue:work --stop-when-empty

于 2019-06-11T14:51:16.813 回答
4

我想写一个带解释的长答案。

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 文档的主管配置部分。

如果您坚持使用cronqueue workers一起使用,请使用queue:work --once让您的工人知道何时停止 :)

于 2018-12-24T12:05:39.037 回答
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始终运行。

请参阅此文档并配置queue:worksupervisor,并使用计划任务将您的作业分派到队列。修改app/console/kernel.php

protected function schedule(Schedule $schedule)
{
    $schedule->call(function () {
        // Do something
        App\MyScheduleJob::dispatch();
    })->daily();
}

现在,队列应该始终运行,并且调度作业可以每天调度到队列。

于 2018-12-24T09:51:48.017 回答
1

根据文档https://laravel.com/docs/5.8/scheduling#scheduling-queued-jobs

您可以通过以下方式简单地排队作业:

$schedule->job(new Heartbeat)->everyFiveMinutes();
于 2019-05-30T23:42:44.173 回答