PDFLib в PHP загружает ресурсы и не сбрасывает в файл

Я только что унаследовал PHP-проект, который генерирует большие PDF-файлы и обычно заглушается после нескольких тысяч страниц и нескольких гигабайт серверной памяти. В проекте использовалась PDFLib для создания этих файлов «в памяти».

Мне было поручено это исправить, поэтому первое, что я сделал, - отправил вывод PDFLib в файл, а не в память. Проблема в том, что он все еще создает память для PDF-файлов. И большая часть памяти, кажется, никогда не возвращается в ОС. В конце концов, все задыхается и умирает.

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

Я надеюсь, что кто-то сталкивался с подобными трудностями.


person Jonathan Hawkes    schedule 05.06.2009    source источник
comment
В: Генерирует ли сервер PDF-документы размером в несколько тысяч страниц или сервер генерирует несколько тысяч PDF-файлов? Интерфейс командной строки php-программы или веб-интерфейс? Т.е. как это началось? И как долго он хранится в памяти?   -  person 0scar    schedule 05.06.2009
comment
Много страниц, не так много PDF-файлов. Это веб-интерфейс (mod_php) в Apache. Часть памяти возвращается, большая часть не возвращается до перезагрузки сервера.   -  person Jonathan Hawkes    schedule 05.06.2009


Ответы (2)


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

person Jonathan Hawkes    schedule 05.06.2009

Вы должны убедиться, что закрываете каждую страницу, а также закрываете документ. Это можно сделать, вызвав "end_page_ext" в конце каждой написанной страницы.

Кроме того, если вы импортируете страницы из другого PDF-файла, вы должны вызывать «close_pdi_page» после каждой улучшенной страницы и «close_pdi_document», когда вы закончите с каждым импортированным документом.

person Lee Hesselden    schedule 05.06.2009