Выходной буфер

Я пишу php-скрипт и где-то перед моей функцией header() я напечатал текст в браузере, тем самым, вызвав функцию header() дал мне известную ошибку:

Предупреждение: невозможно изменить информацию заголовка – уже отправленные заголовки.

Теперь мой вопрос: у меня есть намерения использовать ob_start() и ob_flush() до и после функции header() . Но однажды я услышал, что что-то вроде выходного буфера может отрицательно повлиять на производительность приложения. Насколько это верно?

Или я должен просто придерживаться идеи о печати функции Javascript для перенаправления страницы.

Спасибо за ваше время.

Использование выходного буфера требует, чтобы сервер сохранял весь вывод PHP в ОЗУ, поэтому, если это большая страница, вы завершаете использование достаточного количества памяти – и сервер также должен будет ждать, пока вся страница будет сгенерированный перед отправкой, что может вызвать небольшую задержку. Но кроме этого, я не думаю, что есть большой недостаток в использовании выходного буфера. Для того, что вы хотите сделать, это, безусловно, разумное решение.

Мы должны забыть о небольшой эффективности, скажем, около 97% времени: преждевременная оптимизация – корень всего зла.

Проверьте ob_start и друзей, чтобы узнать, имеет ли разница в производительности. Если это так, найдите альтернативы.

Самый простой вариант – переместить вызов header() перед печатью.

Поскольку вы, скорее всего, выполняете перенаправление с чем-то вроде:

 header('Location: /new/location/'); 

Вы не должны ничего печатать перед вызовом header() потому что клиент ничего не сделал бы с данными, которые вы напечатали в любом случае (если только что-то мне не хватает в HTTP).

(Javascript не является хорошим вариантом для перенаправления и не обновляется, если вы не хотите, по какой-то причине, обнаружить Javascript.)

Перемещение в PHP-код после вывода может сказать о плохом дизайне приложения. Но я не знаю вашей ситуации и могу предложить два возможных способа.

  1. Разделить код на модель (обработка данных) и просмотреть (вывод) (см. MVC ). Это означает, что вы принимаете решение о перемещении даже перед отображением чего-либо. Я назвал этот путь предпочтительным.
  2. Если вам действительно нужно показывать вывод (или другие отправленные заголовки), общий способ заключается в объединении JS и HTML (в noscript):

     if (headers_sent()) { print('<script type="text/javascript">( document.location.replace ) ? document.location.replace("'.$location.'") : document.location.href = "'.$location.'";</script>'."\n".'<noscript><meta http-equiv="Refresh" content="0;URL='.$location.'" /></noscript>'); } else { header('Location: '.$location); exit; } 

PS Этот код является частью Fusebox framework.

просто отвечая на ваше последнее замечание: вы можете перенаправить страницу в php, используя header('Location: '.$url) он должен идти до любого другого вывода, очевидно, и за ним следует exit();