Php за начинаещи

Php за начинаещи

Продължи да публикува статии в серия «PHP за начинаещи", този път ние ще се фокусира върху изхода буфер.

Ако искате, можете накратко за това как стандартния изход буфер в PHP може да се прочете на страниците на официалния ръководството. но това не е моя метод, ще говоря с примерите, а дори и да се осигури работата ще им даде материал.







За да започнете, да дадат на инсталацията - изходните буфери в PHP няколко, плюс уеб-сървърни модули може да изпълнява буфериране и дори браузъри могат да се възпроизвеждат със сключването и не веднага показване на резултата (би било необходимо тук, за да опресните паметта си, а дори и за да споменем Netscape могат да бъдат одрани ).

Сега ще говорим за буфериране в PHP.

Персонализирана изход буфер

Работа с изходен буфер започва с ob_start функция () - в тази функция, има три незадължителни параметри, но те са, за което ще говоря по-късно, но не забравяйте - използвайте ob_start () функция, за да включите изход буфер:

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

Почти всички необходими функции префикс «ob_», не е трудно да се отгатне е абревиатура на «изхода буфер»

ob_get_contents () функция може да се нарече няколко пъти, на практика не са виждали това:

Ако започнете да му изход буфер, но по някаква причина не го затвори, а след това PHP ще го направя за теб, а в края на скрипта за извършване на "рестартиране" на изхода буфер в браузъра на потребителя

Ако вътре ob_start блок - ob_end ви изпрати с глава, тя не попада в буфера, и незабавно ще бъде изпратен на браузъра:

В резултат на това кодът ще се появи в следните заглавки HTTP-пакет:

Разбира се, този код не е нищо повече дисплеи ще бъдат празна страница.

Това правило за изпращане на заглавията е толкова вярно и за заглавието на пряка функция повикване (). и имплицитно в поканата да session_start ():

Ето един малък живот хак - в PHP можете да използвате скоби <> подчертава определени логика в блоковете, без функционално натоварване те носят, но разбираемостта на кода - увеличение

Леко изясни ситуацията - в момента в банката ни е известно има информация за това как да се даде възможност на буфера като получат данните от него и как да го изключите. Какво е по-интересно, можете да получите с него? Да практически нищо с него и наистина - можете да го (нулиране) изпрати на браузъра (ключова дума промиване), чист (чиста), забраните (край). Така комбинирате всичко това, докато купчината също е възможно:

  • ob_clean () - прочете името на функцията като "ясно изходния буфер"
  • ob_flush () - «изпратите изход буфер"
  • ob_end_clean () - «деактивира изхода буфер и свободно"
  • ob_end_flush () - «изходната буфера е изключен и изпратен на браузъра"
  • ob_get_clean () - «получим изход буфер, пречисти и забраните" - там е малко отклонение от правилата, тази функция трябва да бъде по-нататък ob_get_end_clean (). но ние решихме да се опрости и хвърли край
  • ob_get_flush () - «изпратите изход буфер, пречисти и деактивирайте», ob_get_ край _flush ()

Какво може да бъде от следните общо с изходния буфер се определя от трети незадължителен параметър $ флагове, когато се обаждате ob_start функция (). рядко се използва

За по-лесно запомняне тук можете да намерите плакет на семейството на функции:

задача
Попълнете кода по-долу, като се обадите функция, която той правилно изведени «Здравей, свят»:

манипулатор буфер

Време е да се върне в ob_start () и първия параметър - $ output_callback - изход буфер манипулатор. На обаждане-функцията, която се съдържанието на буфера като входен параметър и низа трябва да се върне след лечението трябва да бъде посочено като буфер манипулатор:

В този пример, функция манипулатор линия за връщане на «дължината на низ" Здравей, свят "е 11".







Важен момент - с тези функции трябва да бъдат внимателни, обработените редове ladnenko, но не се опитвайте да предявява каквито и спасяване на данни, не се опитвайте да започне друг изход буфер във функция, както и да има функции, които създават изходен буфер в себе си, това е print_r () и highlight_file ( ) е пример

Можете да се срещнете ob_gzhandler () от стандартните процесори. но по-добра компресия на страниците оставен върху раменете на уеб-сървър, и не го окачите на PHP.

По време на втория параметър $ фаза обратно повикване функция може да включва знамена от семейство PHP_OUTPUT_HANDLER_ *. но тази информация никога няма да се наложи, аз дори не можех да мисля за пример защо е необходимо.

Php за начинаещи

В изходния буфер има Кийлър-функция - можете да започнете друг буфер в буфера, и по-нов и по-така нататък (стига да има достатъчно памет):

В тази функция, например ob_flush () и неговите производни ще "хвърлят" на съдържанието на буфера за по-високо ниво.

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

Ако не знаете какво точно "дълбочина", са - функцията за използване ob_get_level (). и да се "събуди" е полезно за вас следния код:

задача
Направете промени в кода с ob_start () вложени разговори така, че цифрите показват в обратен ред, за това е необходимо да пренаредите три реда код.

"Подразбиране" буфер

Ако искате да създадете обвивка над целия код, а след това е възможно да се използва разтвор на "извън кутията" - "по подразбиране" изход буфер за активиране от него отговаря output_buffering директива. тя може да се постави в On. и да определи размера на буфера, че имаме нужда (при достигане на лимита, буферът ще бъде изпратен на браузъра на потребителя). Настоящата директива следва да се посочи или в php.ini, или .htaccess (за Apache), опит да се създаде тази стойност да се използва ini_set () за нищо не водят, като PHP вече да започне си и изходящия буфер вече е конфигуриран според настройките:

Ако, когато буферът да провери нивото разкрой и предизвика ob_get_level функция (). получаваме 1:

Т.е. ако включите буфера, това ще бъде възможно да се избегне вида на «заглавията вече изпратени» грешка? Да, толкова дълго, колкото е достатъчно буфер, но никога не го направи, в действителност да се разчита на този метод, са всъщност бомба е озеленен, а тя не е известна, когато става "експлодира" и да се насипят грешки:

Не забравяйте, че в молбите за директива CLI output_buffering винаги 0; Този буфер е деактивиран

Защо всичко това?

Добър въпрос - защо да се работи с изход буфер? Ето няколко основни сценария:

  1. Компресиране на данни прехвърля - използва вече споменахме ob_gzhandler ()
  2. Забавени оттегляне да се избегнат грешки «заглавията вече изпратени» (за грешката описано подробно в сесия)
  3. Работа с код на други хора, които се опитва да притежавате нещо изход
  4. Работа с HTML файлове, когато имате нужда да се свържете текстов файл (обикновено въпрос на HTML), за по-нататъшна работа с неговото съдържание

грешка боравене скрипт включва файлове - startuete буферни заглавни файлове, ако нещо се обърка, то съдържанието на буфера може да хвърлят и вместо uninformative съобщения за грешки, извеждане на най-малко информативно съобщение, че сървърът не е добре, и не може да бъде нищо друго.
Пример за работа с критични грешки можете да намерите в обработката на статия за грешка. и там се е позовал на изход буфер, о го виждали всички Е-Е-Е скрит мотив

Система изход буфер

С потребителски изход буфер разбира, нека сега да преминем към системата - това е буфер дисплей, който е изпълнен по време на изпълнението на скрипта и се изпраща към браузъра в края на изпълнение. Т.е. изходният буфер е винаги там, че не е необходимо да се създаде, но можем да го управляват.

Това е толкова просто и кратко, добре, сега за нюансите на система за контрол на изходния буфер ...

Royal Flush

10 секунди след вашето внимание ...

И сега на академичен интерес, нека да разгледаме изпълнението на "действието" - има доста малко код и шепа полезни знания за PHP:

Веднага поразен от флъш повикване () функция - наричайки тази функция, така посочва PHP «нулиране» буферна система, т.е. изпрати всичко, което има в браузъра на потребителя (но знайте, ако сте започнали потребителския буфер, тогава първо трябва да "загубят" го, и едва след това се обадете флъш ()). Т.е. събитие може да бъде описана като:

Друга особеност, която трябва да се помни - implicit_flush директива. Той е отговорен за гарантиране, че след всеки изход автоматично извиква флъш (). Ето защо, следната комбинация от работа в предишния пример:

Тази директива може да се променя "в движение", това е достатъчно, за да предизвика ob_implicit_flush () функция (до изненадващо даден разход функция все още се нарича implicit_flush (), като на изхода буфер на потребителя трябва да се направи косвен съотношение. - След като се обадите ob_flush () ще нарича промиване ()):

Тези примери работят само, когато тъмната output_buffering. в противен случай ще трябва да го принуди да се изключи и ясно в сценария. Ако работите в CLI, а след това implicit_flush знаете винаги включва и изключва output_buffering следователно всички изход веднага ще падне в конзолата

За да изпълните тази задача трябва припомните файла за връзка

За укрепване на разглеждания материал, трябва да се приложи един прост темплейт двигател, който ще съживи следния код:

препоръчителна литература

В заключение

Темата на буфериране ще се върнете отново и отново, докато работи върху PHP проекти, и повярвайте ми, което трябва да знаете и да разберат в коя точка "заби" си заключение, така че да не губите време работи по кода за диагностика и отиде директно на причините за проблемите.

информация