最佳实践如何安排symfony2动作

时间:2013-05-13 09:27:32

标签: symfony cron scheduled-tasks

我的基于symfony2的应用程序必须在不同的时刻和不同的频率上做一些独立的工作。例如,发送简报,编辑报告......

我希望能够从应用程序添加/编辑每个任务 我的任务非常接近cron的工作,并将调用特定的URL。

从我的观点来看:

我考虑创建一个每半小时或十分钟启动脚本的cron作业。这个脚本只做一个curl命令,得到一个docronjob动作。这个docronjobaction在symfony里面,负责完成所有任务并启动它所拥有的任务。

我的问题是:

  • 是否有更清洁的方式来实现这一目标?
  • 在docronaction中如何启动其他操作?
  • 如何设置整个控制器的时间限制为0?
  • 这样做的捆绑包是否已经存在?

4 个答案:

答案 0 :(得分:16)

听起来您正在将您的任务计划存储在数据库中。没问题。对于每种不同类型的任务(例如,发送新闻通讯,保存报告),创建一项服务,完成任务。然后在这个服务中添加一个标记(比如twig.extension,but your own),这样你就可以像TaskChain那样知道所有的任务。

执行create a console command,从数据库中检索计划,加载TaskChain,然后执行任务。可以从cronjob简单地调用此控制台命令,而不会将其暴露给Web。事实上,您通过php-cli而不是从浏览器调用此命令,标准时间限制是无限的。执行时不应涉及任何控制器。

这应该是一个额外的TaskBundle。

答案 1 :(得分:4)

您可以使用this blog来执行您想要的操作。然后,您可以使用cron或其他程序来触发操作。

总结:

首先,您需要创建一个执行您希望的功能的symfony命令。为此,在我们的Bundle中创建一个名为“Command”的文件夹,其级别与我们的“Controller或Resources”相同,并在我们的类中添加一个名称。名称必须以“命令”结束,否则将无效。我们称之为“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文件

来安排cron for Unix或类似的任务
* * * * * php /root/absolute/for/symfony/project/app/console devness:mycommand --myargument=valor

答案 2 :(得分:3)

在处理具有大量命令要管理的应用程序时,我有非常相似的需求(这就是我找到这个旧主题的原因)。

我最终创建了自己的bundle来管理多个symfony命令的执行和排队(通过Doctrine存储的计划任务)。

这是Git存储库:CommandSchedulerBundle

我希望它会帮助别人。

祝你好运

答案 3 :(得分:0)

尝试可以处理的 JmsJobQueue documentation):

  • 列表项
  • 运行Symfony控制台命令,
  • 从数据库中读取作业,
  • 作业安排,
  • 队列大小,
  • 多个队列,
  • 作业依赖(链接逻辑),
  • 实时监控和过滤的网页,
  • 作业详细信息(网页)中的命令输出
  • 命令统计。