Буферизация вывода в PHP?

Кажется, я запутался в буферизации вывода PHP. У меня есть такой код:

function return_json($obj) {
  ob_get_clean();
  ob_start();
  header("Content-Type: application/json");
  echo json_encode($obj);
  exit;
}

Но, похоже, ob_get_clean() ему не нравится. Я делаю это, потому что некоторый HTML может быть случайно сгенерирован до того, как он дойдет до этой точки, но я думал, что вы должны были это сделать именно так.

Что мне не хватает?


person Jordie    schedule 18.03.2009    source источник
comment
Так что именно идет не так? Что вы имеете в виду, говоря, что ob_get_clean() не нравится? Это говорит о том, что заголовки уже отправлены? Если вы не получаете вывод JSON, вы должны удалить ob_start() в своей функции.   -  person GrGr    schedule 18.03.2009
comment
Мои вызовы JSON ошибочны. Похоже, обратной полезной нагрузки нет.   -  person Jordie    schedule 18.03.2009
comment
Если я правильно понял, вы не знаете, что выводит скрипт? Вы используете FireBug? Просто для тестирования: замените Content-Type на что-то HTMLish и вызовите скрипт напрямую.   -  person GrGr    schedule 18.03.2009


Ответы (6)


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

while (ob_get_level()) {
    ob_end_clean();
}
person Gumbo    schedule 18.03.2009

Чтобы использовать ob_get_clean(), вы должны быть уверены, что в какой-то момент вы уже использовали ob_start(). В противном случае нечего чистить буфер, все уже сброшено в пользовательский агент.

person Ilya Birman    schedule 18.03.2009

вам нужно выполнить ob_start до того, как весь ваш код поймает любой вывод до того, как эта функция будет вызвана

person Gabriel Solomon    schedule 18.03.2009
comment
Я делаю ob_start() в начале моего скрипта - person Jordie; 18.03.2009
comment
Вы должны иметь его перед ob_get_clean() - person Johan; 18.03.2009

Если вы просто хотите очистить буфер после запуска буферизации вывода с помощью

ob_start() 

использовать

ob_clean()

Также имейте в виду, что с помощью таких функций, как echo, print_r и т. д., уже ничего не сбрасывается. Поэтому первым делом в вашем скрипте должна быть функция ob_start(). Убедитесь, что ваши включения еще не отправили что-то в браузер.

person Sander Versluys    schedule 18.03.2009

ob_start необходимо вызывать до того, как будет сгенерировано какое-либо содержимое. Обычное использование будет выглядеть примерно так:

ob_start();
# generated content here

$content = ob_get_contents(); # $content now contains anything that has been output already
ob_end_clean();

# generate any headers you need
echo $content;
person Stoo    schedule 18.03.2009

Если проблема заключается в том, что ничего не выводится, похоже, вам не хватает метода сброса? Кроме того, ob_end_clean() может вызываться только после запуска буферизации вывода, в противном случае она возвращает false. Вы не можете использовать методы ob_ для очистки любых существующих заголовков, которые уже были выданы, вам нужно убедиться в этом самостоятельно.

function return_json($obj) {
  ob_start();
  header("Content-Type: application/json");
  echo json_encode($obj);
  ob_end_flush();
  exit;
}
person karim79    schedule 18.03.2009
comment
Похоже, это не проблема, я протестировал неизвестный (yahoo) код, и PHP отлично сбрасывается при выходе. К сожалению, он не говорит нам, какова его продукция. - person GrGr; 18.03.2009