16

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

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

在我看来,我的观点是 :

我考虑创建一个每半小时或十分钟启动一次脚本的 cron 作业。此脚本仅执行 curl 命令,女巫获得 docronjob 操作。这个 docronjobaction 在 symfony 内部,负责获取所有任务并启动它必须执行的任务。

我的问题是:

  • 有没有更清洁的方法来实现这一目标?
  • 在 docronaction 里面我如何启动其他操作?
  • 如何设法将整个控制器的时间限制设置为 0?
  • 是否已经存在执行此操作的捆绑包?
4

4 回答 4

17

听起来您正在将任务计划存储在数据库中。没问题。为每一种不同类型的任务(例如,发送简报、保存报告)创建一个服务来执行该任务。然后向这个服务添加一个标签(比如 twig.extension,但是你自己的),这样你就有了一个任务链之类的东西,它知道所有的任务。

用于执行创建控制台命令,该命令从数据库中检索计划、加载任务链并执行任务。可以从 cronjob 简单地调用此控制台命令,而无需将其暴露给 Web。实际上,您是通过 php-cli 而不是从浏览器调用此命令,标准时间限制是无限的。执行时不应涉及控制器。

这应该全部组织在一个额外的 TaskBundle 中。

于 2013-05-13T09:57:11.957 回答
6

你可以使用这个博客来做你想做的事。然后,您可以使用 cron 或其他程序来触发该操作。

总之:

首先,您需要创建一个 symfony 命令来执行您希望的功能。为此,在我们的 Bundle 中创建一个名为“Command”的文件夹,该文件夹与我们具有“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 或控制台上执行来调用它:

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
于 2014-06-18T21:25:50.403 回答
3

在处理一个需要管理大量命令的应用程序时,我有非常相似的需求(这就是我发现这个老话题的原因)。

我终于制作了自己的包来管理多个 symfony 命令的执行和排队(通过 Doctrine 存储的计划任务)。

这是 Git 存储库:CommandSchedulerBundle

我希望它会帮助某人。

此致

于 2014-10-04T16:29:50.073 回答
1

尝试可以处理的JmsJobQueue文档):

  • 项目清单
  • 运行 Symfony 控制台命令,
  • 从数据库中读取作业,
  • 作业调度,
  • 队列大小,
  • 多个队列,
  • 作业依赖(链接逻辑),
  • 用于实时监控和过滤的网页,
  • 作业详细信息(网页)中的命令输出,
  • 命令统计。
于 2018-04-12T18:34:59.860 回答