it-roy-ru.com

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

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

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

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

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

Мои вопросы:

  • Есть ли более чистый способ добиться этого?
  • Внутри документации, как мне начать действие других?
  • Как мне установить ограничение по времени на 0 для всего контроллера?
  • Пакет, делающий это, уже существует?
14
0x1gene

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

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

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

16
Emii Khaos

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

В итоге:

Прежде всего, вам нужно создать команду symfony, которая выполняет желаемую функциональность. Для этого создайте папку с именем «Command» в нашем Bundle на том же уровне, что и у нас «Controller or Resources», и поместите имя в наш класс. Имя должно заканчиваться на «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
4
Rodol Velasco

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

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

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

Надеюсь, это кому-нибудь поможет.

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

3
n3k

Попробуйте JmsJobQueue ( документация ), которая может обрабатывать:

  • Элемент списка
  • Запуск консольных команд Symfony,
  • Чтение Вакансий из базы данных,
  • Планирование работы,
  • Размер очереди,
  • Несколько очередей,
  • Зависимость от работы (логика цепочки),
  • Веб-страница для мониторинга и фильтрации в реальном времени,
  • Вывод команды в деталях задания (веб-страница),
  • Командная статистика.
0
Takman