Apache2 с PDF и PHP - «Этот файл не начинается с«% PDF- » - PullRequest
3 голосов
/ 17 апреля 2011

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

У меня есть три сервера: Dev (Win7 с Apache2), Test (Ubuntu 10.4 с nginx) и Live (Ubuntu 10.10 с nginx).Все работают под управлением php5 и система, которую я разработал - один и тот же код.Эквивалент, тот же конфиг.

У меня есть много браузеров, с которыми я тестировал: DevIE (win7, IE8), DevFF (Win7 Firefox 3.5), DevSaf (win, Safari), LaptopFF (WinXP, Firfox 3.5), Ноутбук IE (WinXP,IE8 Test (Ubuntu FF3.5) и пользователи (в основном IE8 на Win 7 и Win XP).

  • Когда я генерирую PDF из Test, он работает корректно во всех браузерах (кроме пользователей, которых я могу't test).
  • Когда я генерирую PDF из Dev, он выходит из DevIE, DevFF и DevSaf, но его вызов из Test работает.
  • Apache2 всегда терпит неудачу с одного компьютера.
  • На ноутбуке использование FF завершается успешно, а IE8 не выполняется (см. Ниже).

Пользователи сообщают о периодически возникающих проблемах. Сбой, а затем повторение запроса и успешное выполнение.

При сбое ....

Отображается журнал сгенерированного PDF с отправкой ответа правильного размера (от 500 КБ до 1,8 МБ) с результатом 200 OK. иногда сопровождается примерно через 10 секунд с повторением того же URL- но при этом создается экран входа в систему (снова 200 OK ответа), но только размером 2K.Подразумевается, что он был запрошен без cookie.

Adobe Reader пытается отобразить страницу входа в систему с неизбежным сообщением об ошибке "This file does not start with "%PDF-".

За исключением случаев, когда я пытаюсь работать с ноутбуком и IE8 - тогда происходит сбой, когда show source показывает 4-строчный HTML-файл с пустым телом!

Система работает более года -и только начал сбой со сменой рабочего сервера около 2 месяцев назад.Тестовая версия не была изменена в это время, но также начала давать сбой.

Я перепробовал все виды заголовков, но ничего из того, что я пробовал, не имеет никакого значения.Текущий набор заголовков:

header('Content-Disposition: inline; filename="'.$this->pdfFilename().'"');
header('Content-type: application/pdf');
header("Pragma: public");
$when = date('r',time()+20);  // expire in 20 seconds
header("Expires: $when");

Я пытался заменить inline вложением.Добавление и удаление всевозможных заголовков без кэширования.Все безрезультатно.

Файл PDF запрашивается в новом окне с помощью JavaScript, а через 8 секунд обновляется.Я тестировал без нового окна и без обновления - без изменений.

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

Итак, у меня есть сервер Windows Apache2.2, который дает сбой при просмотре с того же компьютера и успешно выполняется при просмотре с других компьютеров в Firefox.

В браузерах не задействован механизм прокси или кэширования, кроме как в браузерах.

У кого-нибудь есть идеи о том, что может пойти не так?Как я уже сказал, я тестировал и устранял проблемы в течение почти 4 недель, включая и выключая, и я еще даже не определил неисправный компонент.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

Это действительно сложно устранить - для начала (пожалуйста, извините, но я), это яркий пример того, как конвейер не должен выглядеть:

  • Три разные операционные системы.
  • Возможно, по крайней мере, две разные версии PHP.
  • Два разных веб-сервера.

Но в любом случае, несколько общих советов по отладке PHP:

  • обязательно включите error_log и log_errors в php.ini (установите display_errors = Off)
  • используйте самые подробные error_reporting
  • установите access_log и error_logв nginx.
  • поднимите уровень журнала в nginx (я полагаю, вы используете php-cgi или php-fpm, так что вы сможете увидеть, какое состояние выдает серверная часть при неудачной попытке загрузки).

Более того:

  1. Вы не поделились тем, как генерируется PDF - вы уверены, что все используемые здесь библиотеки одинаковы или, по крайней мере, несколько одинаковы во всех системах?
  2. В любом случае, просто чтобы быть уверенным, что я сохраню PDF на сервере, прежде чем он будет предлагается для загрузки.Это позволяет вам устранить неполадки с самим файлом - посмотреть, действительно ли сработала генерация PDF.
  3. Поскольку вы сохраняете PDF, я хотел бы поместить его в папку public ,так что вы можете увидеть, можете ли вы просто перенаправить на него после его создания.И только если это сработает, я бы поработал над принудительной загрузкой.
  4. Я бы копировал производственную среду на всех этапах.;-) Ваш сервер разработки должен быть точно таким же, как и в производственной среде.Для вашей собственной рабочей станции я бы порекомендовал ВМ (например, через Virtualbox с Ubuntu 10.10).

Дайте мне знать, что это вас куда-нибудь и ответит с обновлениями.: -)

Обновление :

Я бы исследовал эти два заголовка:

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

Определенно помогает при очистке кэша.

0 голосов
/ 22 апреля 2011

Это заголовки, которые наконец-то работали в похожей ситуации в одном из моих приложений:

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header( "Content-Type: application/pdf" );
header("Content-Disposition: inline; filename=\"YourPDF_" . time() . ".pdf\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ". strlen( $pdfData ) );

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

Время от времени, но редко, проблема появляется снова. Затем мы просим наших клиентов загрузить файл с помощью контекстного меню браузера.

PS: приложение использует ezPDF, найденный здесь: http://www.ros.co.nz/pdf/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...