Буфер вывода и функция die()/exit()?

Я надеюсь, что праздники у всех проходят хорошо.

Еще один вопрос, связанный с PHP, здесь. Я использую буферы вывода в своем скрипте, поскольку то, что я недавно узнал, является недопустимой причиной (поэтому я могу передать заголовки позже в скрипте). Теперь я понимаю, что я должен хранить весь вывод в переменной или в каком-либо другом хранилище, пока я не буду готов выводить в конце скрипта вместо использования выходных буферов. К сожалению, я уже запрограммировал эти функции и спонтанный вывод html на свои страницы. Я надеялся, что смогу исправить эту проблему во второй версии скрипта, так как у меня есть жесткие сроки, чтобы уложиться в эту версию.

К заданному вопросу. Я планировал это сделать, но видимо функции die() и exit() не так хорошо работают с выходными буферами? У меня есть выход () после всех моих сообщений об ошибках, и вместо того, чтобы завершить выполнение в этот момент, кажется, что скрипт продолжает работать из-за выходного буфера. Я проверил эту гипотезу, удалив буферы вывода, и функции exit() работают должным образом.

Есть ли способ изменить это поведение, или мне следует вернуться к чертежной доске и начать замену моих старых страниц? Кроме того, может кто-нибудь объяснить мне, почему мы должны сохранять вывод до конца? Мне всегда интересно учиться.

Заранее спасибо всем! Наслаждайтесь последними днями 2010 года!


person user509006    schedule 30.12.2010    source источник
comment
@ user509006 - не могу угадать без вашего существующего кода ...   -  person ajreal    schedule 30.12.2010


Ответы (2)


Хотя я оставлю более сложные и абстрактные вопросы более разумным умам, чем я, я бы порекомендовал вам создать функцию-оболочку exit(), чтобы упростить код при наличии ошибок. то есть-

if(!$good)
{
    trigger_error('bleh', E_USER_WARNING);
    errorExit();
}

function errorExit()
{
    ob_flush();
    exit();
}

И замените все ваши выходы этим вызовом функции, и таким образом буфер будет очищен, и программа завершится в нужное время.

person Patrick    schedule 30.12.2010
comment
У меня уже есть функция, но ob_flush() раньше — это то, что мне нужно, чтобы заставить ее выйти сразу! Большое спасибо! - person user509006; 30.12.2010

Разница между заголовком и фактическим содержимым страницы в основном заключается только в том, где они находятся. Как следует из названия, заголовок находится в начале вывода. После этого отправляются две каретки/возврата (символы ввода), и все после этого считается содержимым. Поэтому, если вы что-то повторяете, а затем хотите изменить заголовок, это невозможно сделать. Часть содержимого уже закрыла часть заголовка. То, что вы отправляете как новый заголовок, теперь будет отображаться как обычный текст (если интерпретатор PHP не остановит вас, что он и делает).

Что касается другой части вопроса, ob_flush является хорошим решением, как отметил Патрик.

person Juraj Muránsky    schedule 28.05.2014