Я заметил, что в исходном коде моего сайта есть две пустые строки над HTML. Это выглядит так:
<!-- Two empty lines here, StackOverflow won't let me post empty lines --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html>
HTML создается с помощью PHP. Как узнать, где начался выход?
Я попытался добавить <?php header('...'); ?>
<?php header('...'); ?>
после <html>
, надеясь вызвать такую ошибку, как «Невозможно изменить заголовок. Выход начался в строке …» Но ошибки не произошло.
Если вы хотите получить имя файла и номер строки, где начался вывод, вы можете вызвать функцию headers_sent()
с двумя необязательными параметрами:
$sent = headers_sent($file, $line);
Эти две переменные $file
и $line
будут содержать информацию, которую вы ищете после того, как функция была вызвана. Вам не нужно ждать сообщения об ошибке (но вам может потребоваться очистить вывод (во многих местах), если вы не увидите сообщение об ошибке, и вы хотите определить происхождение). Поэтому убедитесь, что буферизация вывода отключена.
Вероятно, это не вызывает ошибки, потому что то, что вы напечатали до сих пор, слишком короткое и все еще буферизовано перед вызовом заголовка.
Попробуйте вывести еще несколько данных, например:
echo str_repeat('a', 10000);
И затем попытайтесь вывести некоторый заголовок. Затем вы должны увидеть ожидаемую ошибку PHP (при условии, что настройки отчетов об ошибках настроены правильно).
Чтобы ответить прямо на вопрос, любое выражение эха или печати или любая функция, возвращающая результаты непосредственно на стандартный вывод, приведет к запуску вывода. Также, если у вас есть HTML или текст или пустые строки перед открытием <?php
это приведет к запуску вывода.
Вы можете исправить это, добавив ob_start () вверху вашего документа ввода чуть ниже <?php
. И добавление ob_end_flush () в самом конце вашего документа. Это будет выглядеть так.
Добавьте это в самый верх документа:
<?php ob_start(); ?>
Добавьте это в самую нижнюю часть документа:
<?php echo ob_end_flush(); ?>
Это позволяет сохранить текущий код, который у вас есть, и выводить заголовки, где бы вы ни находились в коде, не получая эту ошибку.
Отображать ошибки, помещая эти строки где-то в ваш PHP:
error_reporting(E_ALL); ini_set('display_errors','on');
Это приведет к ошибке заголовка!
Вероятно, это конец файла PHP; вы должны рассмотреть возможность удаления конечного PHP-тега ( ?>
), чтобы устранить эту проблему.
У меня такая же проблема на Drupal (много ile), я пробую несколько из вышеперечисленных ответов без каких-либо результатов.
Наконец, я нашел способ поиска (см. Элегантный способ поиска файлов UTF-8 с BOM? ), Он указывает на туманную ошибку: пробелы в начале файла модуля:
find . -type f -name '*.module' -print0 | xargs -0r awk '/^ / {print FILENAME}{nextfile}' find . -type f -name '*.php' -print0 | xargs -0r awk '/^ / {print FILENAME}{nextfile}' find . -type f -name '*.inc' -print0 | xargs -0r awk '/^ / {print FILENAME}{nextfile}'
У меня была аналогичная проблема со скрытыми спецификациями, но это относится и к линиям пробелов и к другим паразитным символам, поэтому я решил добавить сюда свои выводы.
Добавление поддельного заголовка (""); вызов в коде – лучший способ найти, где был начат вывод, но … скорее всего, в конфигурации PHP по умолчанию установлено значение output_buffering. Проверьте это .
Добавив это в начале вашего скрипта:
if (ob_get_level()) ob_end_clean();
отключит буферизацию вывода и вызовет вызов header () и скажет, где начался выход.
Это может произойти, если у вас есть какие-то пустые строки над самым первым <?php
в вашем коде (если у вас есть «верх» вашего файла)