0

我正在尝试运行一个作业队列以使用ZFSlmQueueBeanstalkd和in 创建 PDF 文件”。DOMPDFModule

这是我在控制器中所做的:

public function reporteAction()
{

    $job = new TareaReporte();
    $queueManager = $this->serviceLocator->get('SlmQueue\Queue\QueuePluginManager');
    $queue = $queueManager->get('myQueue');
    $queue->push($job);
    
    ...

}

这是工作:

namespace Application\Job;

use SlmQueue\Job\AbstractJob;
use SlmQueue\Queue\QueueAwareInterface;
use SlmQueue\Queue\QueueInterface;
use DOMPDFModule\View\Model\PdfModel;

class TareaReporte extends AbstractJob implements QueueAwareInterface
{

    protected $queue;

    public function getQueue()
    {
        return $this->queue;
    }

    public function setQueue(QueueInterface $queue)
    {
        $this->queue = $queue;
    }

    public function execute()
    {
        $sm = $this->getQueue()->getJobPluginManager()->getServiceLocator();
        $empresaTable = $sm->get('Application\Model\EmpresaTable');
        $registros = $empresaTable->listadoCompleto();
        $model = new PdfModel(array('registros' => $registros));
        $model->setOption('paperSize', 'letter');
        $model->setOption('paperOrientation', 'portrait');
        $model->setTemplate('empresa/reporte-pdf');

        $output = $sm->get('viewPdfrenderer')->render($model);

        $filename = "/path/to/pdf/file.pdf";
        file_put_contents($filename, $output);
    }
}

第一次运行,文件创建完成,工作成功,但第二次运行,任务被埋没,文件没有创建。

在尝试第二次渲染模型时,它似乎处于无休止的循环中。

4

1 回答 1

0

我遇到过类似的问题,结果证明这是因为 ZendPdf\PdfDocument 重用它的对象工厂的方式。你在使用 ZendPdf\PdfDocument 吗?

您可能需要正确关闭工厂。

class MyDocument extends PdfDocument
{
    public function __destruct()
    {
        $this->_objFactory->close();
    }
}

尝试添加这个或类似于 PdfDocument 类的东西......

更新:您似乎没有使用 PdfDocument,但是我怀疑这是相同的问题。您是否能够在正常的 http 请求中重新生成第二个 PDF?确保每次运行时环境均等是您的工作。如果您无法克服这个问题,一个短期的快速解决方案是将 SlmQueue 的 max_runs 配置设置为 1。这样,工作人员在每次作业后都会停止,并将其重置为普通状态......

于 2014-02-15T09:30:28.890 回答