Буферизация вывода в PHP? - PullRequest
2 голосов
/ 18 марта 2009

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

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

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

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

Ответы [ 6 ]

9 голосов
/ 18 марта 2009

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

7 голосов
/ 18 марта 2009

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

while (ob_get_level()) {
    ob_end_clean();
}
3 голосов
/ 18 марта 2009

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

1 голос
/ 18 марта 2009

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

ob_start() 

использование

ob_clean()

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

0 голосов
/ 18 марта 2009

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

function return_json($obj) {
  ob_start();
  header("Content-Type: application/json");
  echo json_encode($obj);
  ob_end_flush();
  exit;
}
0 голосов
/ 18 марта 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;
...