最佳实践如何安排 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 的情况下操作模型的最佳实践?并且无需到处重复样板代码[关闭]