在Lumen / Laravel安排工作:我这样做是否正确?

时间:2017-12-12 11:09:08

标签: php laravel cron jobs lumen

根据以下教程(https://laravel.com/docs/5.5/scheduling),我想出了以下脚本来在我的Lumen应用程序中安排作业:

namespace App\Console;

use App\Jobs\ClearAccessLog;
use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;

use App\Jobs\Special\DeleteCache;
use App\Jobs\Special\FetchRemoteArticles;
use App\Jobs\Special\FetchUpdateCategories;
use App\Jobs\Special\UpdateArticles;
use Illuminate\Support\Facades\Queue;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {

        $schedule->call(function() {
            Queue::bulk([
                new FetchUpdateCategories,
                new FetchRemoteArticles,
                new UpdateArticles,
                new DeleteCache
            ],null,'specialqueue');
        })->daily();

        // listen to
        $schedule->job(new ClearAccessLog())->weekly();

        // listen to the helpdocs queue
        $schedule->command('php artisan queue:work --timeout=0 --memory=4096 --queue=specialqueue')->everyFiveMinutes();

        // listen to default jobs
        $schedule->command('php artisan queue:work --timeout=0 --memory=4096')->daily();
    }
}

根据我服务器的文档,我只需要注册一个单独的cronjob:

crontab -e

然后添加:

* * * * * php /path-to-my-project/artisan schedule:run >> /dev/null 2>&1

无论如何,我注意到如果我执行

php artisan queue:work --timeout=0 --memory=4096 --queue=specialqueue

通过SSH继续监听,直到命令停止,因此我不确定调度程序是否每五分钟启动一个新的后台任务,而其他任务仍然在运行?

如何才能启动此命令一次?一般来说,你看到一些明显的错误(我是这个话题的新手)?

1 个答案:

答案 0 :(得分:2)

按计划启动队列工作人员不正确。队列工作者是守护进程,如果有任何工作可以监听,如果没有,那么它将一直睡到下一个工作可用。你要做的是创建无意义的队列工作者。

您应该查看手册Laravel Queues。如果允许您安装Supervisor,请让主管控制您的队列工作人员。主管可以帮助您监控队列工作者,并且无论如何都会因为某些错误而失败,它会尝试重新启动。

否则,您应该通过ssh在后台启动队列工作程序,并从当前用户分离该进程。但是,如果发生任何故障,队列工作程序将不会自动重启。