最佳实践如何安排 symfony2 操作 [关闭]

Posted

技术标签:

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

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

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

在我看来:

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

我的问题是:

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

【问题讨论】:

【参考方案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 控制台命令, 从数据库中读取作业, 作业调度, 队列大小, 多个队列, 作业依赖性(链接逻辑), 用于实时监控和过滤的网页, 作业详细信息中的命令输出(网页), 命令统计。

【讨论】:

以上是关于最佳实践如何安排 symfony2 操作 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

getForm() symfony2.8 后更改表单对象默认参数的最佳实践

Symfony2 共享的 CSS 和 JS 资产在哪里,最佳实践是明智的?

架构:在不污染 POJO 的情况下操作模型的最佳实践?并且无需到处重复样板代码[关闭]

Android strings.xml 最佳实践? [关闭]

Symfony 2 - 使用资产

最佳实践 - 根据状态操作,这样能避免吃掉异常