Лучшая практика, как планировать действие symfony2
Мое приложение на основе symfony2 должно выполнять отдельные задания в разные моменты и разные частоты. Например, отправка информационного бюллетеня, редактирование отчета...
Я хочу иметь возможность добавлять/редактировать каждую задачу из приложения
Моя задача будет очень близка к заданиям cron и будет состоять в вызове определенного URL-адреса.
С моей точки зрения:
Я думаю о создании задания cron, запускающего script каждые полчаса, или десять минут. этот script выполняет только команду curl, чтобы получить действие docronjob. Это docronjobaction находится внутри symfony и отвечает за то, чтобы получить всю задачу и запустить тот, который у нее есть.
Мои вопросы:
- Есть ли более чистый способ добиться этого?
- Внутри docronaction как запустить другие действия?
- Как мне установить ограничение времени на 0 для всего контроллера?
- Существует ли пакет, который делает это allready?
Ответы
Ответ 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
Я надеюсь, что это поможет кому-то.
С наилучшими пожеланиями