@Hfnas

Почему не работает планировщик задач schedule?

Добрый вечер.
Задача, есть некая таблица Крон, которая содержит подзадачи, которые нужно запускать последовательно. То есть после подзадачи 1 нужно запускать подзадачу 2, после подзадачи2 нужно подзадачу 3 и т.д.. Как правильно реализовать? Я бы еще хотела записывать дату старта подзадачи, стату успешного окончания подзадачи. Правильно ли я понимаю, что одним schedule тут не обойтись, нужен еще и job.

Если пробовать вручную прописывать список команд, без обращения к репозиторию, то все работает.

1. Прописала в Kernel.php
<?php

namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use App\Repositories\CronsRepository;

class Kernel extends ConsoleKernel
{
    /**
     * Create a new console kernel instance.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @param  \Illuminate\Contracts\Events\Dispatcher  $events
     * @return void
     */
    private $cronRepository;

    public function __construct(Application $app, Dispatcher $events, CronsRepository $cronsRepository)
    {
        parent::__construct( $app, $events);
        $this->cronRepository=$cronsRepository
    }

    /**
     * Define the application's command schedule.
     */
    protected function schedule(Schedule $schedule): void
    {
      $commands=$this->cronRepository->getActiveCommands();      
      foreach ($commands as $key=>$command){
            if ($key>0){
                $schedule->events()[0]->then(function($command) {
                    $this->call($command->command)
                         ->withoutOverlapping()
                });
            }else {
                $schedule
                    ->command($command->command)
                    ->cron($command->time)
                    ->withoutOverlapping();
            }
        }
    }

    /**
     * Register the commands for the application.
     */
    protected function commands(): void
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}


Я даже пробовала в kernel.php прописывать
if (isset($commands[0])) {
            $schedule
                ->command($commands[0]->command)
                ->cron($commands[0]->time)
                ->withoutOverlapping();

            if (isset($commands[1])){
                $schedule->events()[0]->then(function($commands) {
                    $this->call($commands[1]->command)
                         ->withoutOverlapping();
                });
            }
        }
  • Вопрос задан
  • 154 просмотра
Решения вопроса 1
yesbro
@yesbro
Думаю, помогаю думать
Я бы через планировщик запускал только первую задачу. Потом вторую из первой, третью из второй и так далее.

Если задачи долгие, то тогда сделал бы это (запуск второй и более задач) очереди.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы