2014-11-19 2 views
0

Updateпредупреждение PHP не показывает, когда он должен

Установка output_buffering 0 в php.ini решает эту проблему. Но есть ли способ сделать это, не полагаясь на эту директиву? В соответствии с PHP docs эта директива имеет режим PHP_INI_PERDIR, что означает, что она не может быть установлена ​​с помощью ini_set() и должна быть установлена ​​в одном из php.ini, .htaccess, httpd.conf или .user.ini.

Оригинальный вопрос

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

error_reporting(E_ALL); 
ini_set('display_errors', 1); 
echo ini_get('error_reporting'); 
header('location:./'); 

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

Разработка

PHP v5.5.15 
error_reporting = E_ALL 
display_errors = On 

Тестирование

PHP v5.3.27 
error_reporting = E_ALL 
display_errors = On 

Я подозреваю, что может быть другая настройка PHP для этого, но я не смог найти его. Есть идеи?

+4

Возможно, сервер имеет буферизацию вывода, включенную по умолчанию? проверьте phpinfo() до/после эхо-вызова и посмотрите, действительно ли ваши ожидаемые настройки действуют или переопределены в другом месте. –

+0

Я попытался установить output_buffering на 0 в php.ini, и это сработало! Моя тестовая среда также уже имела output_buffering = 0.Другие вещи, которые я обнаружил, заключались в том, что выполнение phpinfo() запускает предупреждение независимо от output_buffering, а использование ini_set() для изменения output_buffering «на лету» не работает. – thewiglaf

+0

также отмечают, что если по какой-либо причине сервер имеет отключенную переопределенную конфигурацию ini_set/error_reporting, вы вполне можете отбросить логическую ложную или пустую строку, которая НЕ запускает заголовки. Попробуйте отозвать фиксированную строку, например. 'echo 'hello'', чтобы вы знали, что что-то получится. –

ответ

0

Директива PHP output_buffering должна быть установлена ​​в 0, чтобы видеть результат перед отправкой заголовка перенаправления. Это может быть достигнуто только путем:

Установка директивы в php.ini или .user.ini

output_buffering = 0 

Или при использовании Apache и модификации .htaccess или httpd.conf

php_flag "output_buffering" Off 

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

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

Примечание: Вы также можете позвонить по телефону flush() или ob_end_flush() до звонка до header(), и он выдаст желаемое предупреждение.

Смежные вопросы