Создание длинного документа TCPDF без таймаута (так долго работает процесс php) - PullRequest
2 голосов
/ 07 марта 2012

Я встраиваю функцию сайта, которая будет генерировать PDF (с использованием TCPDF) в буклет из 500+ страниц.Макет очень прост, но из-за количества записей я думаю, что он квалифицируется как «длительный процесс php».Это нужно будет делать всего несколько раз в год, и если бы я мог просто запустить его в фоновом режиме и отправить по электронной почте администратору, это было бы идеально.Рассматривается Cron, но это пользовательский тип функций.

Что я могу сделать, чтобы рендеринг PDF продолжался так долго?Я "хорош" с PHP, но не так сильно с * nix.Даже ссылка на учебник будет полезна.

Ответы [ 3 ]

3 голосов
/ 04 апреля 2012

Честно говоря, вам следует избегать делать это полностью с точки зрения масштабируемости.Я бы использовал таблицу базы данных, чтобы «планировать» работу с параметрами, иметь скрипт, который постоянно проверяет эту таблицу.Затем используйте JavaScript для опроса вашего приложения, чтобы файл был «готов», когда файл будет готов, а затем разрешите JavaScript перетаскивать файл на клиент.в то время как вы задаетесь вопросом, почему мой веб-сервер так медленно работает.Apache не позволяет легко определить, какой процесс потребляет какой процессор.

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

Удачи!

1 голос
/ 07 марта 2012

Вам нужно изменить максимально допустимое время выполнения PHP-скриптов. Вы можете сделать это несколькими способами из самого скрипта (вы должны предпочесть это, если он будет работать) или изменив php.ini.

ВНИМАНИЕ - Изменение времени выполнения может серьезно снизить производительность вашего сервера. Скрипт может запускаться только определенное время (30 секунд по умолчанию), прежде чем он будет остановлен синтаксическим анализатором. Это помогает предотвратить связывание плохо написанных сценариев с сервером. Вы должны точно знать, что вы делаете, прежде чем сделать это.

Вы можете найти больше информации о:

PS: это должно работать, если вы используете PHP для генерации PDF. Это не будет работать, если вы используете некоторые вещи вне скрипта (называемые exec(), system() и аналогичные).

0 голосов
/ 30 мая 2013

На этот вопрос уже дан ответ, но в результате других вопросов / ответов здесь, вот что я сделал, и он отлично работал: (Я сделал то же самое, используя pdftk, но в меньшем масштабе!)

Я поместил следующий код в iframe:

set_time_limit(0);                   // ignore php timeout
//ignore_user_abort(true);           // optional- keep on going even if user pulls the plug*
while(ob_get_level())ob_end_clean();// remove output buffers
ob_implicit_flush(true); 

Это позволило избежать тайм-аута загрузки страницы.Возможно, вы захотите поставить обратный отсчет или индикатор выполнения на родительской странице.Первоначально у меня был iframe, отправляющий обновления прогресса родителю, но обновления браузера сломали его.

...