2010-10-04 4 views
0

Может ли кто-нибудь объяснить, почему следующий скрипт ведет себя по-разному на двух разных платформах?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, но я чувствую, что это должно работать. Есть ли расширение/модуль, который мне не хватает?

ответ

2

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

the manual От:

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

+0

Спасибо wrikken, Есть ли другой способ выполнить ту же задачу, которая более эффективна и/или элегантна? Под «задачей» я подразумеваю подстановку всего предыдущего вывода в какой-то шаблон, продемонстрированный просто выше. Я использую эту систему в своем шаблоне шаблонов (MVC). – phife757

+0

Как правило, единственная причина для вывода буфера связана с тем, что вам может потребоваться отправить другие заголовки. Правильное решение состоит в том, чтобы сначала выполнить все манипуляции и данные, а после того, как вы получили все данные и отправили заголовки, затем начните вывод тела ответа. С надлежащей архитектурой это легко достигается. Однако, если вы планируете систему просто эхо/распечатываете напрямую в STDOUT, это боль. Это _hould_ IMHO возвращает строки, которые вы выберете для эха или сохранения позже. Если все это происходит в STDOUT, я вручную вызываю функции 'ob_start()' непосредственно перед выполнением. – Wrikken