PHP / Apache — как увидеть предупреждения скрипта перед перенаправлением заголовка?

#php #apache

#php #apache

Вопрос:

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

На самом деле я хотел бы, чтобы любые предупреждения останавливали выполнение скрипта (например, ошибки) на моей машине разработки, но были невидимыми на других серверах — так что это означает некоторую настройку конфигурации, а не изменение скриптов. Возможно ли это? Я использую Apache 2.2 и PHP 5.2

Все предупреждения обычно отображаются на моем сервере разработки, но когда за ними следует перенаправление заголовка, я их не вижу. Пример:

 <?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 'On');
unset($undef);
echo $undef; // generates warning, should stop redirect.
//exit; 
//when previous line is uncommented, I see the warning
header("Location: http://www.google.com"); // still happens, but shouldn't
exit;
?>
  

Комментарии:

1. Мое предложение в подобных средах — в значительной степени полагаться на ваш журнал ошибок.

Ответ №1:

На ваших серверах разработки поместите:

 error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 'On');
ob_start();
...

if(ob_get_length() > 0){
    ob_flush();
    exit();
}
header(...);
  

перед перенаправлением заголовка (как показано). Если что-то находится в буфере, оно будет отображено, и это приведет к сбою перенаправления заголовка, потому что невозможно выполнить перенаправление заголовка, если что-то было отображено в браузере. Если вы включите display_errors Off на своих производственных серверах, эти сообщения не будут отображаться.

Комментарии:

1. Я помещаю это поверх скрипта, и перенаправления все равно происходят после создания предупреждений. Я повторяю некоторый $undefinedvariable перед вызовом header(), и он генерирует предупреждение, но header() все еще перенаправляет.

2. Опубликуйте код, с которым у вас возникла проблема, в своем вопросе. Если вы считаете, что генерируется предупреждение, выполните exit() перед вашим header() , чтобы подтвердить свою теорию.

3. если я поставлю exit; перед header(), я увижу предупреждение. Если выхода нет; тогда перенаправление происходит так, как если бы предупреждение не было показано. Именно так я обычно проверяю наличие предупреждений перед перенаправлением, путем exit; непосредственно перед вызовом header(), но это слишком сложно менять и менять каждый раз.

4. Пожалуйста, напишите, что вы видите на свой вопрос. Я не могу отлаживать то, что не вижу.

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

Ответ №2:

Сделайте что-то вроде этого:

 //header("location: such-and-such");
  

лол, но на самом деле; это не так просто.