проблемы с памятью в dompdf - PullRequest
3 голосов
/ 24 февраля 2010

Я использую DOMPDF для генерации около 500 отчетов из одного скрипта. Недостаточно памяти после того, как было сгенерировано около 10-15 PDF-файлов.

При отладке похоже, что он загружает 8M каждый раз, когда попадает в загрузчик шрифтов, но это похоже на то, что должно обрабатываться с помощью кода кэширования шрифтов.

Есть идеи, что здесь происходит не так? Я хотел бы опубликовать простой фрагмент кода, но большая часть его разделена на несколько слоев, так что это не просто копирование / вставка.

Ответы [ 3 ]

2 голосов
/ 12 июля 2010

Если вы используете бета-версию dompdf 0.6, ошибка памяти является результатом бесконечного цикла, который dompdf вводит при рендеринге таблиц. Это известная проблема, которую мне не удалось решить.

Соответствующие URL:

http://code.google.com/p/dompdf/issues/detail?id=34

http://code.google.com/p/dompdf/issues/detail?id=91

(ошибка, которую вы видите: pdf PHP Фатальная ошибка: допустимый объем памяти 268435456 байт исчерпан)

1 голос
/ 24 февраля 2010

Как указывает cletus, самым быстрым решением для вас с DOMPDF, вероятно, будет рендеринг каждого отчета в отдельном процессе. Вы можете написать мастер-скрипт, который вызывает дочерний скрипт (используя exec), который выполняет фактический рендеринг. Как вы можете видеть в этом обсуждении о группе поддержки DOMPDF, кажется, что он может немного повысить производительность.

Трудно сказать, что происходит в отношении использования памяти, без какого-либо примера, демонстрирующего проблему. Я не верю, что есть много оптимизаций DOMPDF и лежащего в основе механизма рендеринга CPDF для нескольких экземпляров в одном скрипте. Таким образом, шрифт, вероятно, загружается в память каждый раз, хотя он может использовать статическую переменную для кэширования этих данных.

1 голос
/ 24 февраля 2010

Во-первых, если это для чего-то удаленно коммерческого, просто получите Prince XML . Это существенно лучше и быстрее, чем любое другое решение HTML в PDF (и я посмотрел их все). Стоимость будет быстро окуплена в сэкономленное время разработчика.

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

Взгляните на Конвертировать HTML + CSS в PDF с PHP? .

...