Я пытаюсь создать PDF файл с помощью KnpSnappyBundle в Symfony, но всякий раз, когда я пытаюсь выполнить это действие, он превышает максимальное время выполнения 60 секунд в PHP.
Вот действие:
/**
* @Route("/download-agreement", name="download_agreement")
*/
public function downloadAgreementAction()
{
$session = new Session();
$html = $this->renderView('client-representation.html.twig', array(
'clientAgreementData' => $session->get("sessionClientAgreementData"),
"pdfStatus" => true
));
return new Response(
$this->get('knp_snappy.pdf')->getOutputFromHtml($html),
200,
array(
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="error.pdf"'
)
);
}
Это также, по-видимому, превышает время выполнения, когда я использую абсолютные URL-адреса для активов в шаблоне ветки, например, absolute_url(asset('css/agreement.css'))
. Если я использую относительные URL-адреса, то css будет просто проигнорирован, и PDF будет генерировать, но, конечно, мне нужен стиль.
Есть идеи?
EDIT: для всех, кто имеет эту проблему, использование абсолютных URL-адресов СЛЕДУЕТ работать на производственном сервере; на localhost, однако, у вас может возникнуть проблема, с которой я столкнулся. Спасибо шаласу.
Хорошо, решение действительно просто на самом деле, проблема в том, что он не будет работать в среде dev (local), потому что по какой-то причине wkhtmltopdf не любит localhost: 8000... что угодно.
Из этой проблемы (и многих других) открылась эта проблема в пакете laravel.
Еще один из пакетов https://github.com/KnpLabs/KnpSnappyBundle/issues/66
В первый раз, когда я работал с KnpSnappyBundle, я использовал множество альтернатив, безуспешно.
"Тайм-аут превышен" возникает при попытке генерировать pdf файл с использованием представления (то же самое для всех связанных методов класса Pdf
), который содержит один или несколько абсолютных URL-адресов.
Чтобы справиться с этой ошибкой, я использую конкретный шаблон, используемый только для генерации Pdf, где я помещаю css непосредственно в блок <style></style>
.
Таким образом, стиль правильно применяется.
set_time_limit(0);
в качестве первой строки в вашем действии контроллера, чтобы удалить 60-секундный тайм-аут, а затем посмотреть, завершится ли когда-либо страница, или даже попытаться выполнитьreturn new Response($html);
чтобы убедиться, что вы все еще получаете то, что ожидаете.