Как я могу узнать, где начался мой вывод? - PullRequest
3 голосов
/ 14 июля 2011

Я заметил, что в исходном коде моего сайта есть две пустые строки над 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('...'); ?> после <html>, надеясь вызвать ошибку типа «Невозможно изменить заголовок. Вывод начался со строки ...», но ошибка не возникла.

Ответы [ 7 ]

11 голосов
/ 06 апреля 2013

Если вы хотите получить имя файла и номер строки, где начался вывод, вы можете вызвать функцию headers_sent() с двумя необязательными параметрами:

$sent = headers_sent($file, $line);

Эти две переменные$file и $line будут содержать информацию, которую вы ищете после вызова функции.Вам не нужно ждать сообщения об ошибке (но вам может потребоваться сбросить вывод (во многих местах), если вы не видите никакого сообщения об ошибке и хотите точно определить источник).Поэтому убедитесь, что выходная буферизация отключена.

2 голосов
/ 14 июля 2011

Вероятно, это не вызовет ошибку, потому что то, что вы распечатали, слишком короткое и все еще буферизовалось перед вызовом заголовка.

Попробуйте вывести еще некоторые данные, например:

echo str_repeat('a', 10000);

А затем попробуйте вывести какой-нибудь заголовок.Затем вы должны увидеть ожидаемую ошибку PHP (при условии, что ваши настройки отчетов об ошибках настроены правильно).

0 голосов
/ 29 сентября 2015

У меня просто была похожая проблема со скрытыми спецификациями, но это относится и к пустым строкам и другим ложным символам, поэтому я решил добавить сюда свои выводы.

Добавление поддельного заголовка (""); вызов в коде - лучший способ узнать, с чего начался вывод, но ... скорее всего, в конфигурации PHP включен output_buffering по умолчанию. Проверьте это из.

Добавив это в начале вашего скрипта:

if (ob_get_level()) ob_end_clean();

отключит буферизацию вывода и вызовет функцию header () и скажет, где начался вывод.

0 голосов
/ 20 сентября 2013

У меня та же проблема на Drupal (много файлов), я пробую несколько из приведенных выше ответов без каких-либо результатов.

Наконец, я нашел способ find (ср. Элегантный способ поиска файлов 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}'
0 голосов
/ 14 июля 2011

Чтобы ответить на ваш вопрос напрямую, любой оператор echo или print или любая функция, которая возвращает результаты напрямую в стандартный вывод, вызовет запуск вывода.Кроме того, если перед открывающим тегом <?php есть какой-либо HTML, текст или пустые строки, это приведет к началу вывода.

Это можно исправить напрямую, добавив ob_start () в полев верхней части вашего вступительного документа чуть ниже тега <?php.И добавление ob_end_flush () в самом конце вашего документа.Это будет выглядеть следующим образом.

Добавьте это в самый верх вашего документа:

<?php
    ob_start();
?>

Добавьте это в самый низ вашего документа:

<?php
    echo ob_end_flush();
?>

Это позволяет вам сохранить текущий код, который у вас есть, и выводить заголовки, где бы они вам ни понадобились, внутри кода, без получения этой ошибки.

0 голосов
/ 14 июля 2011

Это может произойти, если в вашем коде есть пустые строки над самой первой <?php (при условии, что она находится в верхней части вашего файла)

0 голосов
/ 14 июля 2011

Показать ошибки, поместив эти строки где-нибудь в вашем PHP:

error_reporting(E_ALL);
ini_set('display_errors','on');

Это вызовет ошибку заголовка!

Это, вероятно, в конце файла PHP; вам следует рассмотреть возможность удаления конечного тега PHP (?>), чтобы устранить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...