ob_get_clean() не работает на MAMP, но работает на WampServer?

Кто-нибудь может объяснить, почему следующий скрипт ведет себя по-разному на двух разных платформах?

Скрипт:

<?php

echo "hello!";

$view_content = ob_get_clean();

echo "'".gettype($view_content)."' >".$view_content."<";

Выход 1 (на WampServer 2i - php v5.3.0 - Windows 7 x64):

'string' >hello!<

Выход 2 (на MAMP 1.9 - php v5.3.2 - OSX 10.6.4):

hello!'boolean' ><

Похоже, что MAMP неправильно выполняет функцию ob_get_clean(). Я также попробовал v5.2.13 php на MAMP и увидел ту же проблему.

Я понимаю, что это разные «версии» php, но я чувствую, что это должно работать. Есть ли расширение / модуль, который мне не хватает?


person phife757    schedule 04.10.2010    source источник


Ответы (1)


Вероятно, на 1 хосте автоматическая буферизация вывода на. Я бы не советовал этого делать, так как это потребляет ресурсы, которые в большинстве случаев не нужны. Вы можете использовать и установить его, если полагаетесь на него, лучший способ, ИМХО, - просто вызвать ob_start(), когда возникнет реальная необходимость.

Из руководства:

Возвращаемые значения
Возвращает содержимое выходного буфера и завершает буферизацию вывода. Если буферизация вывода не активна, возвращается FALSE.

person Wrikken    schedule 04.10.2010
comment
Спасибо, wrikken. Есть ли другой способ выполнить ту же задачу, более эффективный и/или элегантный? Под «задачей» я подразумеваю подстановку всех предыдущих выходных данных в некий шаблон, продемонстрированный выше. Я использую эту систему в своем шаблоне шаблонов представления (MVC). - person phife757; 04.10.2010
comment
Обычно единственная причина для буферизации вывода заключается в том, что вам может понадобиться отправить другие заголовки. Правильное решение состоит в том, чтобы сначала выполнить все манипуляции и извлечение данных, а после того, как вы получите все данные и отправите заголовки, начните выводить тело ответа. При правильной архитектуре это легко достигается. Однако, если вы создаете систему шаблонов, просто выводя/выводя прямо в STDOUT, это проблема. Он должен IMHO возвращать строки, которые вы выбираете для отображения или сохранения на потом. Если все это действительно переходит в STDOUT, я бы вручную вызывал ob_start() функции непосредственно перед выполнением. - person Wrikken; 04.10.2010