генерация PDF из HTML занимает много времени только при использовании локальных ресурсов - PullRequest
2 голосов
/ 04 ноября 2019

Я использую KnpSnappyBundle 1.6.0 и wkhtmltopdf 0.12.5 для создания PDF-файлов из HTML в PHP, например:

$html = $this->renderView(
    'pdf/template.html.twig',
    [ 'entity' => $entity, ]
);

return new PdfResponse($snappy->getOutputFromHtml($html,
    ['encoding' => 'UTF-8', 'images' => true]), 'file'.$entity->getUniqueNumber().'.pdf'
);

Моя проблема: на моем рабочем сервере, когда я ссылаюсь на ресурсы (изображения или CSS), находящиеся на одном сервере, создание PDF занимает около 40-50 секунд. Даже когда я использую только крошечное изображение на том же сервере, это занимает 40 секунд. Я мог бы использовать изображения намного большего размера, которые размещены на другом сервере, и генерирование PDF будет происходить мгновенно.

Мой сервер не медленно обслуживает ресурсы или файлы в целом. Если я просто отображаю HTML как страницу, это происходит мгновенно (с активами или без них). Когда я локально запрашиваю ресурсы с моего производственного сервера для создания PDF, это также происходит мгновенно.

Все ресурсы, которые мне нужны в HTML, которые должны быть отображены в PDF, имеют абсолютные URL-адреса, это необходимо для работы wkhtmltopdf. Например: <img src="https://www.example.com/images/logo.png"> Сложно то, что все работает, но очень медленно. Там нет указания на несуществующий актив, который может привести к тайм-ауту.

Сначала я подумал, что это может быть связано с wkhtmltopdf, поэтому я пробовал разные версии и разные настройки, но это ничего не изменило. Я также пытался указать на другой домен на том же сервере, проблема остается. Так что теперь я думаю, что это проблема с сервером. Я использую Nginx-1.16.1 и обслуживаю весь контент по SSL. У меня установлена ​​ libssl-dev1.1.1d-1 (последняя стабильная версия), и у меня установлена ​​ОС Ubuntu 18.04.3 LTS .

Когда я просматриваю логи доступа Nginx, я вижу запрос на получение по моему собственному IP-адресу при использовании ресурсов с того же сервера. Я не могу понять, почему это занимает так много времени, и у меня закончились идеи, что делать дальше. Любые идеи приветствуются!

1 Ответ

0 голосов
/ 05 ноября 2019

Я не нашел корень моей проблемы. Тем не менее, я нашел обходной путь. Я сделал следующее:

Установите wkhtmltopdf глобально:

sudo apt-get install wkhtmltopdf 

Это установит wkhtmltopdf 0.12.4 (5 ноября 2019 г.) через репозитории Ubuntu. Это более старая версия wkhtmltopdf, и ее запуск сам по себе вызвал у меня множество проблем. Чтобы решить эту проблему, я теперь запускаю его внутри xvfb . Сначала установите его, выполнив:

sudo apt-get install xvfp

Затем измените двоичный путь используемой оболочки, которая указывает на wkhtmltopdf:

'/usr/bin/xvfb-run /usr/bin/wkhtmltopdf' 

В моем случае я использую KnpSnappyBundle и задайте двоичный путь в моем .env файле. В knp_snappy.yaml я установил binary: '%env(WKHTMLTOPDF_PATH)%', а в .env я установил WKHTMLTOPDF_PATH='/usr/bin/xvfb-run /usr/bin/wkhtmltopdf' (как описано выше). Теперь я могу создавать PDF-файлы в обычном режиме.

...