【问题标题】:Asynchron PDF generation while redirecting to next page in symfony2 app?在 symfony2 应用程序中重定向到下一页时异步生成 PDF?
【发布时间】:2013-10-01 17:41:32
【问题描述】:

我正在使用奏鸣曲管理包开发一个 symfony2 项目。

我有一个大的 pdf,其中包含在表单输入和写入数据库后生成的图像。 我在持久化数据结束时开始生成 pdf。之后用户被重定向。

我的计划:我想在将数据保存到数据库后触发 pdf 生成。但是重定向正在等待pdf文档准备好。这需要很长时间。因此应该完成重定向,同时应该触发 pdf 生成并在后台运行。

如果成功创建了 pdf,标题中应该会出现一条通知消息。

PDF 生成是使用 DOMPDF 完成的。所以它是直接在 php 中完成的,而不是使用单独的命令行工具。

有人知道如何实现这个吗?

我正在考虑重定向完成后的 ajax 请求。这是个好方法吗?

【问题讨论】:

标签: php ajax symfony pdf-generation sonata-admin


【解决方案1】:

你想过使用事件吗?

你可以这样写一个事件:

 class PdfGeneratorListener
{
    public function onPdfReady(EventInterface $event)
    {
        // create pdf or whatever
    }
}

当你决定时调用它:

$eventDispatcher->notify(new Event($pdfcontent, 'pdf.ready'));

【讨论】:

  • 是的,我在考虑事件。但我认为我也必须等到创建 pdf。还是我错了?
  • 您可以重定向并在发生这种情况时(使用事件)触发您的自定义事件以创建 pdf。这只是一个例子,我相信还有其他方法可以解决它。
  • 好的,我过几天试试。必须修复其他东西,然后我要实施它。但欢迎其他想法:)。
【解决方案2】:

我终于通过以下方式解决了我的问题:

  1. 注册 EventListener: 使用 EventDispatcher 通知主题(报价、订单...)被注入的特殊事件。将根据主题呈现 pdf 文档。

    public function onOfferUpdate(OfferEvent $event)
    {
      $offer = $event->getOffer();
      $em = $this->container->get('doctrine')->getEntityManager();
    
      $job = new Job('acme:pdfgenerator:write', array('--entity="'.get_class($offer).'"', '--id='.$offer->getId()));
      $job->addRelatedEntity($offer);
      $em->persist($job);
      $em->flush();
    }
    
  2. 创建 acme:pdfgenerator:write 命令:创建一个在终端中执行的命令,该终端处理最终的 pdf 创建。使用给定的主题 ID 调用此命令。在为有效主题查找数据库后,它将生成 pdf 并将其放置到文件系统中。

  3. 使用 JobQueue: 安装并启动一个简单的 JobQueue(我使用 JMSJobQueueBundle)。

    app/console jms-job-queue:run  # To start listing to the job queue
    
  4. 可选:我已经实现了一个获取给定作业状态的 ajax 请求。因此,如果文档创建完成,用户会收到一条消息。

现在就像一个魅力。 pdf 创建将在单独的过程中执行,用户无需等待几秒钟即可看到下一页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多