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

0

Обновить

Установка output_buffering в 0 в php.ini решает эту проблему. Но есть ли способ сделать это, не полагаясь на эту директиву? Согласно документам PHP эта директива имеет режим 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:./');

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

развитие

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 () до / после вызова echo и посмотрите, действительно ли ожидаемые настройки действительно действуют или переопределяются в другом месте.
  • 0
    Я попытался установить output_buffering в 0 в php.ini, и это сработало! Моя тестовая среда также уже имела output_buffering = 0. Другие вещи, которые я обнаружил, состояли в том, что выполнение phpinfo () будет вызывать предупреждение независимо от output_buffering, а использование ini_set () для изменения output_buffering на лету не работает.
Показать ещё 1 комментарий
Теги:

1 ответ

0

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

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

output_buffering = 0

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

php_flag "output_buffering" Off

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню