Создание PDF-файлов с изображениями происходит слишком медленно

На данный момент у меня есть большое узкое место — создание PDF-файлов каждый раз, когда кто-то размещает заказ. Это не имеет большого значения для одного заказа, но когда их много за короткий промежуток времени, этот процесс очень медленный.

Файл PDF требует текстовой информации, QR-кода, штрих-кода, логотипа и 1 или более (до 20+) изображений шириной 1/4.

Текущий процесс с DOMPDF:

  1. Изображение QR-кода, созданное с помощью PHP и сохраненное в формате png
  2. Изображение штрих-кода, созданное и сохраненное в формате png
  3. DomPDF генерирует PDF

Новая мысль:

  1. HTML2PDF создает PDF и использует теги qr и bar для создания штрих-кодов

Теоретически это позаботится о изображениях QR и штрих-кода, но, тем не менее, остальные изображения делают его слишком медленным.

Делая это таким образом, без каких-либо изображений, кроме (QR и штрих-кода), PDF-файл может генерироваться за ~ 500 мс, но как только я начинаю добавлять изображения, он занимает до 2, 3, 4, 5+ секунд каждое.


При выполнении тестов и обработке ~ 10 тыс. Заказов (за несколько минут) он все еще обрабатывал PDF-файлы примерно через 12 часов, пока я просто не разочаровался.

PDF создается в отдельном процессе очереди, поэтому человеку не нужно ждать при оформлении заказа, но — тем не менее … им не может потребоваться более 5 часов, чтобы получить подтверждающий PDF во время большого трафика.


Вопросы / TLDR:

Как я могу ускорить процесс создания PDF-файлов с динамическим QR-кодом, динамическим штрих-кодом, динамическим текстом и 1-20 статическими изображениями (изображения одинаковы во всех PDF-файлах)?

Есть ли другие потенциальные вещи, о которых я не думал? Может быть, сделать шаблон PDF и каким-то образом использовать PHP, чтобы просто заполнить динамические места?

9

Решение

Я настоятельно рекомендую вам использовать библиотеку TCPDF. Это довольно быстро и может быть легко интегрировано в CakePHP. Вы можете найти много примеров того, как включить изображения, штрих-коды и QR-коды в PDF в примерах TCPDF. страница.

Для дальнейшего улучшения производительности используйте советы от этот страница:

  • Установите и настройте кэш-код PHP-кода, такой как XCache;
  • Отредактируйте файл php.ini и увеличьте максимальный объем памяти, который может потреблять скрипт (memory_limit);
  • Отредактируйте файл php.ini и увеличьте максимальное время выполнения каждого скрипта (max_execution_time);
  • Отредактируйте файл config / tcpdf_config.php: вручную установите константы $ _SERVER [‘DOCUMENT_ROOT’], K_PATH_MAIN и K_PATH_URL и удалите часть автоматического вычисления;
  • Если вы не используете тайский язык, отредактируйте файл config / tcpdf_config.php и установите для константы K_THAI_TOPCHARS значение false;
  • Если вам не нужны расширенные символы, отредактируйте файл config / tcpdf_config.php и установите шрифты по умолчанию для основных шрифтов;
  • Если вам не нужен UTF-8 Unicode, установите для параметра $ unicode в конструкторе TCPDF значение false, а для параметра $ encoding — «ISO-8859-1» или другую карту символов.
  • По умолчанию TCPDF включает поднабор шрифтов, чтобы уменьшить размер встроенных шрифтов Unicode TTF. Этот процесс, который очень медленный и требует много памяти, можно отключить с помощью метода setFontSubsetting (false);
  • По возможности используйте базовые шрифты вместо встроенных;
  • Избегайте использования синтаксиса HTML (методы writeHTML и writeHTMLCell), если это строго не требуется;
  • Разбить большие блоки HTML на более мелкие части;
  • Избегайте использования транзакций, если это строго не требуется;
  • Перезапустите веб-сервер после изменений.

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

4

Другие решения

Вы можете попробовать использовать JPEG вместо файлов PNG, если вам не нужна прозрачность.

Например, в TCPDF мне пришлось сгенерировать PDF с большим PNG в фоновом режиме (18см x 18см, 300 точек на дюйм). Мне пришлось ждать 11 секунд, прежде чем файл будет создан.
Я заменил изображение на JPEG такого же размера и DPI, и это заняло менее 1 секунды.

1

TCPDF также очень медленно работает с изображениями

0