ZF2 - 使用SlmQueueBeanstalkd和DOMPDFModule创建PDF文件的作业队列

时间:2014-02-14 22:32:30

标签: php zend-framework2 pdf-generation dompdf job-queue

我正在尝试运行作业队列,使用ZF中的SlmQueueBeanstalkdDOMPDFModule来创建PDF文件。

Estoy tratando de correr una tarea para crear un archivo PDF usando SlmQueueBeanstalkdDOMPDFModule en ZF2。

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

Esto es lo que estoy haciendo en el controlador:

...

public function reporteAction()
{

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

    ...

}

这是工作:

Esta es la tarea:

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);
    }
}

第一次运行时,会创建文件并且工作成功,但是,如果再次运行,则会隐藏任务并且不会创建文件。

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

我很感激你可以帮助我。

谢谢。

La primera vez que se ejecuta,el archivo es creado y el trabajo es exitoso,sin embargo,si se ejecuta una segunda vez,la tarea queda enterrada y el archivo no se crea。

Parece que se queda en un ciclo interminable cuando trata de renderizar el modelo la segunda vez。

Apreciaríaomeoque me puedan ayudar。

格拉西亚斯。

1 个答案:

答案 0 :(得分:0)

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

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

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

尝试添加此类或类似于PdfDocument类的内容......

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