Лучшая практика, как планировать действие symfony2 - программирование
Подтвердить что ты не робот

Лучшая практика, как планировать действие symfony2

Мое приложение на основе symfony2 должно выполнять отдельные задания в разные моменты и разные частоты. Например, отправка информационного бюллетеня, редактирование отчета...

Я хочу иметь возможность добавлять/редактировать каждую задачу из приложения Моя задача будет очень близка к заданиям cron и будет состоять в вызове определенного URL-адреса.

С моей точки зрения:

Я думаю о создании задания cron, запускающего script каждые полчаса, или десять минут. этот script выполняет только команду curl, чтобы получить действие docronjob. Это docronjobaction находится внутри symfony и отвечает за то, чтобы получить всю задачу и запустить тот, который у нее есть.

Мои вопросы:

  • Есть ли более чистый способ добиться этого?
  • Внутри docronaction как запустить другие действия?
  • Как мне установить ограничение времени на 0 для всего контроллера?
  • Существует ли пакет, который делает это allready?
4b9b3361

Ответ 1

Звучит, что вы сохраняете свое расписание задач в базе данных. Нет проблем. Для каждого другого типа задачи (например, отправка бюллетеня, сохранение отчетов) создайте службу, которая выполняет эту задачу. Затем добавьте к этому сервису тег (например, twig.extension, но ваш собственный), поэтому у вас есть что-то вроде TaskChain, который знает все задачи.

Для выполнения создать консольную команду, которая извлекает расписание из базы данных, загружает TaskChain и выполняет задачи. Эта консольная команда может быть просто вызвана из cronjob, не выставляя ее в Интернете. Фактически, вы вызываете эту команду через php-cli, а не из браузера, стандартный лимит времени неограничен. Никакие контроллеры не должны участвовать в выполнении.

Все это должно быть организовано в дополнительном TaskBundle.

Ответ 2

Вы можете использовать этот блог, чтобы делать то, что вы хотите. Затем вы можете использовать программу cron или someother для запуска действия.

Вкратце:

Прежде всего, вам нужно создать команду symfony, которая выполняет те функции, которые вы хотите. Для этого создайте папку "Command" в нашем Bundle на том же уровне, на котором у нас есть "Контроллер или ресурсы", и укажите имя в нашем классе. Имя должно заканчиваться "Command", иначе оно не будет работать. Позвольте называть его "MyCommand".

    <?php
    namespace Devvness\DevvnessBundle\Command;

    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Output\OutputInterface;

    class MyCommand extends ContainerAwareCommand
    {


 protected function configure()
    {
        $this->setName('devvness:my_command')
            ->setDescription('Descripción de lo que hace el comando')
            ->addArgument('my_argument', InputArgument::OPTIONAL, 'Explicamos el significado del argumento');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $em = $this->getContainer()->get('doctrine')->getManager();
        // Hacemos lo que sea
        $output->writeln('Hola mundo');
        $em->flush();
    }
}

Затем вы можете вызвать его, выполнив команду cmd или console:

php app/console devness:mycommand 

или

php app/console devness:mycommand --my_argument=valor

Затем вам нужно запланировать задачу cron для Unix или что-то вроде этого, отредактировав файл cron

* * * * * php /root/absolute/for/symfony/project/app/console devness:mycommand --myargument=valor

Ответ 3

У меня были очень схожие потребности (почему я нашел эту старую тему), работая над приложением с большим количеством команд для управления.

Наконец, я сделал свой собственный пакет для управления исполнением и очередью команды mutiple symfony (запланированные задачи, хранящиеся через Doctrine).

Вот репозиторий Git: CommandSchedulerBundle

Я надеюсь, что это поможет кому-то.

С наилучшими пожеланиями