PHP: дело о загадачном пробеле
Или история о том, как побились картинки.
Однажды от пользователей пришла жалоба, что новые картинки, которые они на проект грузят не отображаются. Только если полностью обновить страницу.
Проверил данные в кеше - картинки были. Все как положено - пережатые и с водяными знаками. После ряда танце с бубном удалось выяснить, что скрипт, который картинку генерирует пока ее в кеше нет отдает пробел в каждой картинке - на скриншоте это хорошо выдно. Идет пробел, а после стандартный заголовок jpeg.
Чтож. Очень вероятно, что какой-то вредный скрипт оказался с пробелом. Мы же помним вро стандартные открывающиеся и закрывающиеся теги php, которые принесли много головной боли.
Но как среди тысяч строк кода выяснить, где начинается вывод злобного пробела?
- отключить вывод самой картинки и убедится, что пробел все еще выводится.
- отключить буферизацию вывода на стороне сервера - убедится, что пробел есть
- в самом конце скрипта поставить 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
Категории: Разработка HowTo