ZF2 — очередь заданий для создания PDF-файла с использованием SlmQueueBeanstalkd и DOMPDFModule.

Я пытаюсь запустить очередь заданий для создания файла PDF, используя SlmQueueBeanstalkd и DOMPDFModule в ZF.

Вот что я делаю в своем контроллере:

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

При первом запуске файл создается и работа проходит успешно, однако при повторном запуске задача хоронится и файл не создается.

Кажется, что это остается в бесконечном цикле при попытке отрендерить модель во второй раз.


person Carlos Álvarez    schedule 14.02.2014    source источник


Ответы (1)


У меня была похожая проблема, и оказалось, что это из-за того, как ZendPdf\PdfDocument повторно использует свою фабрику объектов. Вы используете ZendPdf\PdfDocument?

Возможно, вам потребуется правильно закрыть factory.

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

Попробуйте добавить это или что-то подобное в класс PdfDocument...

update: похоже, вы не используете PdfDocument, однако я подозреваю, что проблема та же. Можете ли вы восстановить второй PDF-файл в обычном HTTP-запросе? Ваша задача — убедиться, что окружающая среда одинакова при каждом запуске. Если вы не можете решить эту проблему, краткосрочным быстрым решением будет установка конфигурации max_runs для SlmQueue на 1. Таким образом, рабочий процесс останавливается после каждого задания, и это сбрасывается в ванильное состояние...

person bas    schedule 15.02.2014
comment
Спасибо что нашли время ответить. Ваш ответ был полезен. Я не смог найти причину проблемы. На данный момент я выбрал быстрое исправление, установившее для max_runs SlmQueue значение 1. Остановка рабочего процесса после того, как каждое задание правильно создает PDF-документ. - person Carlos Álvarez; 17.02.2014