Php буфериране на изхода

Страница 1 от 4

Буфериране на изхода в PHP е доста полезно нещо, ако знаете как да го използвате. Кажи ми колко пъти сте виждали типа грешка:

Внимание: Не мога да променя информацията в заглавието - заглавията вече изпратени от (продукция стартира в.)







Обикновено това се случва, когато искате да изпратите бисквитка, или за извършване на операции, които допринасят за превоза им, или други операции благоприятна за изпращане на заглавията, като например въвеждането на хедър на сесия или приложение функция или други подобни. Или вашия файл се кодира в Unicode, както и в самото начало се спотайваше BOM - Байт Поръчка Марк. Тя podlyuschaya нещо е, непрекъсваем пространство с нулева ширина. Погледни под заглавието "байт ред".

Възможността за буфериране

Използването на буфериране на изхода, ние може да:

  • Изпрати бисквитка от всяка точка на сценария.
  • За да започнете сесия по всяко време.
  • Компресиране на данни преди да го изпратите на потребителя.

Compression допълнително натоварване на процесора, обаче, обемът на трафика на една страница ще намалее приблизително четиридесет процента, което означава, че сървърът ще харчат по-малко време, изпращане на данни по мрежата. Размерът на компресия, зависи от много фактори, като компресира изображението по-лошо от текста.

Какво се случва, когато глупак?







Когато буфериране на изхода, PHP механизъм подредени цялата продукция на скрипта, паралелно да се формира HTTP пакет - заглавията, включително заглавията и добавяне на "бисквитката" и всички други, които са получени в резултат на работата на скрипта. След това, когато сценария е работил той взима и всичко това изпраща на клиента в правилния ред: Първите заглавията, а след това на страницата - в резултат на сценария.

Как да се даде възможност на буфериране на изхода?

Първият начин е, ако на сървъра е твой, или искаш да просто да има достъп до файла php.ini (както писах по-горе) се търси в него output_buffering директива и се присвоява стойност на On. Това буфериране е активиран за всички скриптове.

Вторият начин е да използвате функцията ob_start () в скрипта, заключението, че ние трябва да се буферира. Този метод е за предпочитане - получавате голяма гъвкавост / контрол в работата, както и по-добра преносимост.

По мое мнение доста удобно да се помисли за контрол на изхода под формата на определени контейнери - буфери. По-лесно е да се разбере тяхната работа.

Така че, за да отворите такъв контейнер - буферът може да бъде само една функция ob_start (). но това е буфер, за да затворите, разполагате с две функции: ob_end_flush () и ob_end_clean ()

Затваря буфер и изпраща данните.

Затваря буфер, без да изпраща данни.

Цялото съдържание, което се показва в момента, когато буферът получава отвори в буфера и няма да бъде изпратен. Например:

Този скрипт показва резултата:

Нека да се разбере какво се е случило. Ние сме създали три буфери. Редове 1-3 - това е първата. Той затвори ob_end_flush функция () - неговият извод можем да видим резултата.

Второ буфер - линия 5-7. Затворен е с функция на ob_end_clean () - така че резултатите от дейността си загубил bezsledno.

Третият буфера - линия 9-10. Той не е затворен, по никакъв начин! - Shozanah? - Вие питате. Толкова е просто - в края на сценария, PHP автоматично затваря всички буфери, като че ли те са били затворени ob_end_flush функция ().