【问题标题】:best practice how to schedule symfony2 action [closed]最佳实践如何安排 symfony2 操作 [关闭]
【发布时间】:2013-05-07 07:00:02
【问题描述】:

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

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

在我看来:

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

我的问题是:

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

【问题讨论】:

    标签: symfony cron scheduled-tasks


    【解决方案1】:

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

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

    这一切都应该组织在一个额外的 TaskBundle 中。

    【讨论】:

    • 听起来很干净:D!但是您的意思是:“如果任务创建服务,则对于每种不同的类型”?正如您所说,我的任务在数据库中,我希望能够在不接触代码的情况下添加新任务,因此我无法为每个任务创建服务。我知道我应该为每个“类型”的任务创建一个 taskService。例如什么类型?
    • 对不起,错字。 of 类型。对于每种类型的任务,您都需要一些代码。发送时事通讯(或更基本的电子邮件)应该是一项任务服务。或创建报告,还需要一些特定和通用的代码。这是必须要做的。配置任务可以放在数据库中。
    • 感谢@Pazi 的建议。我将尝试实施您的解决方案,因为它比我的更好! (我会把帖子搁置几天,看看是否还有其他想法)
    • Kk。也许还有其他一些方法。这只是一种可能的方式,因为我在一些应用程序中这样做,其中数据库灵活配置满足代码中的不同任务。
    【解决方案2】:

    您可以使用this blog 来做您想做的事。然后,您可以使用 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或者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】:

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

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

      这里是 Git 存储库:CommandSchedulerBundle

      我希望它会对某人有所帮助。

      最好的问候

      【讨论】:

      • 非常感谢你的贡献,我会仔细看看你的包
      • @J-Mose 您的捆绑包非常棒。但我对一些问题很生气。是否可以从当前调度程序执行的数据库中获取 id ?调度程序也无法写入日志,它给了我下面的错误php.INFO: Not quoting a scalar starting with the "%" indicator character is deprecated since Symfony 3.1 and will throw a ParseException in 4.0
      【解决方案4】:

      试试 JmsJobQueue (documentation) 可以处理:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-30
        • 2019-02-02
        • 1970-01-01
        • 1970-01-01
        • 2014-02-04
        • 1970-01-01
        • 1970-01-01
        • 2013-10-02
        相关资源
        最近更新 更多