Я пишу php-скрипт и где-то перед моей функцией header()
я напечатал текст в браузере, тем самым, вызвав функцию header()
дал мне известную ошибку:
Предупреждение: невозможно изменить информацию заголовка – уже отправленные заголовки.
Теперь мой вопрос: у меня есть намерения использовать ob_start()
и ob_flush()
до и после функции header()
. Но однажды я услышал, что что-то вроде выходного буфера может отрицательно повлиять на производительность приложения. Насколько это верно?
Или я должен просто придерживаться идеи о печати функции Javascript для перенаправления страницы.
Спасибо за ваше время.
Использование выходного буфера требует, чтобы сервер сохранял весь вывод PHP в ОЗУ, поэтому, если это большая страница, вы завершаете использование достаточного количества памяти – и сервер также должен будет ждать, пока вся страница будет сгенерированный перед отправкой, что может вызвать небольшую задержку. Но кроме этого, я не думаю, что есть большой недостаток в использовании выходного буфера. Для того, что вы хотите сделать, это, безусловно, разумное решение.
Мы должны забыть о небольшой эффективности, скажем, около 97% времени: преждевременная оптимизация – корень всего зла.
Проверьте ob_start
и друзей, чтобы узнать, имеет ли разница в производительности. Если это так, найдите альтернативы.
Самый простой вариант – переместить вызов header()
перед печатью.
Поскольку вы, скорее всего, выполняете перенаправление с чем-то вроде:
header('Location: /new/location/');
Вы не должны ничего печатать перед вызовом header()
потому что клиент ничего не сделал бы с данными, которые вы напечатали в любом случае (если только что-то мне не хватает в HTTP).
(Javascript не является хорошим вариантом для перенаправления и не обновляется, если вы не хотите, по какой-то причине, обнаружить Javascript.)
Перемещение в PHP-код после вывода может сказать о плохом дизайне приложения. Но я не знаю вашей ситуации и могу предложить два возможных способа.
Если вам действительно нужно показывать вывод (или другие отправленные заголовки), общий способ заключается в объединении 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();