Медленная генерация PDF с PHP + DomPDF - PullRequest
0 голосов
/ 19 февраля 2019

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

Проблема: у сайта электронной коммерции, которым я управляю, естьфункциональность, позволяющая продавцам загружать PDF-файл с уже выполненными заказами на покупку (в основном, копия подтверждения покупки, отображаемая покупателю).Это всегда работало хорошо.Проблема возникла, когда я развернул дополнительную функцию, позволяющую продавцам загружать отдельный файл PDF со всеми заказами на покупку, созданными между заданным пользователем набором дат.Когда количество заказов на покупку, которые необходимо было экспортировать в виде одного PDF-файла (по одному на страницу), превысило 20-30, процесс стал чрезвычайно медленным (как за 30-60 секунд).

Получение данных избаза данных и разбор это не было проблемой.Создание представления, которое позже было экспортировано в PDF, также не было проблемой (вывод HTML на экран занимал долю секунды даже при сотнях заказов), поэтому я был в основном уверен, что проблема была в dompdf.

Настройка была следующей: 1.- База данных MySQL 2.- Сервер приложений: несколько экземпляров PHP + Nginx + PHP-fpm с балансировкой нагрузки под управлением Linux 3.- PHP 7.2 4.- dompdf 0.82 (последняя версия) 5.- Codeigniter 3.0.9 6.- Начальная загрузка для форматирования макета

Цель состояла в том, чтобы разрешить загрузку нескольких (возможно, сотен) заказов на покупку в одном PDF-документе в приемлемое время.

1 Ответ

0 голосов
/ 19 февраля 2019

РЕШЕНИЕ:

После долгих поисков, проб и ошибок, много просматривая Stackoverflow (ни одна из статей, которые я нашел, не была действительно полезной), я понял, что этобыла начальная загрузка, которая вызывала проблему.

Я использовал начальную загрузку для очень простого управления компоновкой, и я понял, что связать всю библиотеку (даже уменьшенную) с представлением, которое было отправлено в dompdf, было излишним, но яЯ не хотел переписывать файл представления.

Итак, я выбрал другой подход: получите определения CSS для конкретных классов (6, возможно, 7), которые использовал мое представление, и вставьте их в *Тег 1009 * в представлении

<style>
.row {
  margin-right: -15px;
  margin-left: -15px;
}
.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
  position: relative;
  min-height: 1px;
  padding-right: 15px;
  padding-left: 15px;
}

.col-lg-12 {
    width: 100%;
}

.text-center {
  text-align: center;
}

body {
  font-family: Helvetica, Arial, sans-serif;
  font-size: 12px;
  line-height: 1.42857143;
  color: #333;
  background-color: #fff;
}
(...) the list goes on a little longer for some other bootstrap styles and other site-specific ones made by yours truly.
</style>

и полностью исключают загрузочную загрузку из представления.

повторное тестирование, результаты были поразительными: заказ на поставку 100 (100 страниц) PDF (размером менее 60 КБ), который создавался и передавался пользователю в течение 30-60 секунд перед изменением, теперь создается за менее чем за полсекунды , что подтверждаетэта компоновка начальной загрузки приводит к ОГРОМНЫМ накладным расходам на dompdf, что, вероятно, не нужно в 99% случаев использования.

Надеюсь, это кому-нибудь поможет.Чтобы понять это, потребовалось немало дней.

...