PHP: дело о загадачном пробеле

28 Oct 2016

%d0%b2%d1%8b%d0%b4%d0%b5%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5_103Или история о том, как побились картинки.

Однажды от пользователей пришла жалоба, что новые картинки, которые они на проект грузят не отображаются. Только если полностью обновить страницу.

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

Чтож. Очень вероятно, что какой-то вредный скрипт оказался с пробелом. Мы же помним вро стандартные открывающиеся и закрывающиеся теги php, которые принесли много головной боли.

Но как среди тысяч строк кода выяснить, где начинается вывод злобного пробела?

  1. отключить вывод самой картинки и убедится, что пробел все еще выводится.
  2. отключить буферизацию вывода на стороне сервера - убедится, что пробел есть
  3. в самом конце скрипта поставить setcookie или header - в логах пояится сообщение вида “ Warning : Cannot modify header information - headers already sent by (output started at file.php:XXX)”. Где file.php - это соответсвенно файл, а XXX - номер строки, где начался вывод.

Чтобы отключить буферизацию нужно прописать в конфигах php.ini

output\_buffering=0

Или в конфигах апача или htaccess

php\_flag "output\_buffering" Off