Введення в функції контролю виведення PHP., Стиснення і кешування, PHP, статті

Одна з найкращих речей в PHP4 – те, що Ви можете передати PHP буферу весь контент, згенерований у скрипті, так що нічого не буде послано браузеру, поки Ви не вирішите це зробити. Ви можете застосовувати цю особливість, щоб використовувати заголовок і функції setcookie, скрізь, де Ви хочете у вашому скрипті. Однак, це – лише невелика частина можливостей потужних функцій виводу.

<?
void ob_start(void)
?>

Використовується, щоб повідомити PHP процесору про переадресації всього виведення на внутрішній буфер. Нічого не буде послано браузеру після запиту до ob_start ().

<?
string ob_get_contents(void);
?>

Повертає буфер виводу в рядку так, що Ви можете переслати накопичений висновок браузеру (після відключення буферизації!).

<?
int ob_get_length(void);
?>

Повертає довжину буфера виводу.

<?
void ob_end_clean(void);
?>

Очищає буфер виводу і вимикає буферизацію виводу. Ви повинні використовувати цю функцію до виведення контента браузеру.

void ob_implicit_flush ([int flag])

Використовується, щоб вклвикл неявний потік (default = off). Якщо включено, то “Потік” виконується для кожної print / echo або команди виводу і висновок негайно надсилається в браузер. (Директива неявній відсилання говорить PHP про те, що виводяться дані потрібно автоматично передавати браузеру після виведення кожного блоку даних. Її дія еквівалентно викликам функції flush () після кожного використання print () або echo () і після кожного HTML-блоку. Включення цієї директиви серйозно уповільнює роботу, тому її рекомендується застосовувати лише в налагоджувальних цілях. – з коментарів до php.ini, прим. Alexela)

Використання Контролю виводу, щоб стиснути висновок PHP.


Ви потребуєте Zlib розширенні, компільованому в PHP4, щоб стиснути висновок. Якщо необхідно, см. Zlib розширення в PHP документації для установки інструкцій.

Перш за все, ініціалізує буферизацію виводу:

<?
Ob_start ();
Ob_implicit_flush (0);
?>

Потім, згенеруйте весь зміст (контент), використовуючи print, echo, або інше, що Ви хочете. Наприклад:

<?
print("Hey this is a compressed output!");
?>

Після того, як сторінка згенерована, ми повертаємося до висновку, використовує:

<?
$contents = ob_get_contents ();
Ob_end_clean ();
?>

Потім, ми повинні перевірити, чи підтримує браузер стиснення даних. Якщо так, браузер посилає ACCEPT_ENCODING HTTP заголовок вебсервер в запиті. Ми можемо перевірити змінну $ HTTP_ACCEPT_ENCODING і перевірити “gzip, deflate”:

<? if(ereg(“gzip, deflate”,$HTTP_ACCEPT_ENCODING)) { // Generation of
Gzipped content } else { echo $contents; } ?>


Це просто. Структуровано і досить ясно, щоб використовувати. Давайте подивимося, як ми створимо gzipped висновок:

(Taken from PHP.net)
// Tell the browser that they are going to get gzip data
// Of course, you already checked if they support gzip or x-gzip
// and if they support x-gzip, you”d change the header to say
// x-gzip instead, right?
header("Content-Encoding: gzip" );
// Display the header of the gzip file
// Thanks ck@medienkombinat.de!
// Only display this once
echo "x1fx8bx08x00x00x00x00x00";
// Figure out the size and CRC of the original for later
$Size = strlen($contents);
$Crc = crc32($contents);
// Compress the data
$contents = gzcompress( $contents, 9);
// We can”t just output it here, since the CRC is messed up.
// If I try to "echo $contents" at this point, the compressed
// data is sent, but not completely. There are four bytes at
// the end that are a CRC. Three are sent. The last one is
// left in limbo. Also, if we "echo $contents", then the next
// byte we echo will not be sent to the client. I am not sure
// if this is a bug in 4.0.2 or not, but the best way to avoid
// this is to put the correct CRC at the end of the compressed
// data. (The one generated by gzcompress looks WAY wrong.)
// This will stop Opera from crashing, gunzip will work, and
// other browsers won”t keep loading indefinately.
//
// Strip off the old CRC (it”s there, but it won”t be displayed
// all the way — very odd)
$contents = substr($contents, 0, strlen($contents) – 4);
// Show only the compressed data
echo $contents;
// Output the CRC, then the size of the original
gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);
// Done. You can append further data by gzcompressing
// another string and reworking the CRC and Size stuff for
// it too. Repeat until done.
function gzip_PrintFourChars($Val) {
for ($i = 0; $i < 4; $i ++) {
echo chr($Val % 256);
$Val = floor($Val / 256);
}
}
?>

Якщо ви хочете подивитися це як робочий приклад, то ось весь скрипт цілком:

<?
// Start the output buffer
ob_start();
ob_implicit_flush(0);
// Output stuff here…
print("I”m compressed!
");
$contents = ob_get_contents();
ob_end_clean();
// Tell the browser that they are going to get gzip data
// Of course, you already checked if they support gzip or x-gzip
// and if they support x-gzip, you”d change the header to say
// x-gzip instead, right?
header("Content-Encoding: gzip");
// Display the header of the gzip file
// Thanks ck@medienkombinat.de!
// Only display this once
echo "x1fx8bx08x00x00x00x00x00";
// Figure out the size and CRC of the original for later
$Size = strlen($contents);
$Crc = crc32($contents);
// Compress the data
$contents = gzcompress($contents, 9);
// We can”t just output it here, since the CRC is messed up.
// If I try to "echo $contents" at this point, the compressed
// data is sent, but not completely. There are four bytes at
// the end that are a CRC. Three are sent. The last one is
// left in limbo. Also, if we "echo $contents", then the next
// byte we echo will not be sent to the client. I am not sure
// if this is a bug in 4.0.2 or not, but the best way to avoid
// this is to put the correct CRC at the end of the compressed
// data. (The one generated by gzcompress looks WAY wrong.)
// This will stop Opera from crashing, gunzip will work, and
// other browsers won”t keep loading indefinately.
//
// Strip off the old CRC (it”s there, but it won”t be displayed
// all the way — very odd)
$contents = substr($contents, 0, strlen($contents) – 4);
// Show only the compressed data
echo $contents;
// Output the CRC, then the size of the original
gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);
// Done. You can append further data by gzcompressing
// another string and reworking the CRC and Size stuff for
// it too. Repeat until done.
function gzip_PrintFourChars($Val) {
for ($i = 0; $i < 4; $i ++) {
echo chr($Val % 256);
$Val = floor($Val / 256);
}
}
?>

Кешування PHP виводу.


Коли PHP4 не існував, і я змушений був використовувати PHP3, я був дуже зацікавлений в появі якогось механізму кешування для виведення PHP скриптів, щоб зменшити навантаження бази даних, доступ до filesystem, і т.д. Не мало сенсу робити це в PHP3, але з буферизацією виводу, це легко в PHP4.

Простий приклад:

//Construct a filename for the requested URI
$cached_file=md5($REQUEST_URI);
if((!file_exists("/cache/$cached_file"))||(!is_valid("/cache/$cached_file"))) / / Тут зверніть увагу на шлях до файлу $ cached_file, прим. Alexela
{
// is_valid validates the cache, you can check for expiration
// or particular conditions in that function.
// If there”s no file or it”s invalid we generate the output
ob_start();
ob_implicit_flush(0 );
// Output stuff here…
$contents = ob_get_contents();
ob_end_clean();
$fil=fopen($cached_file,"w+"); / / Fwrite ($ fil, $ contents, $ strlen ($ contents)) ;/ / помилка в коді, прим. Alexela
fwrite($fil,$contents,strlen($contents));
fclose($fil);
}
//Output the file here we are sure the file exists.
readfile($cached_file);
?>

Це простий приклад. Використовуючи буферизацію виводу, Ви можете будувати дуже просунуту контент генеруючу систему, використовуючи caching механізми, різні для різних блоків чи додатків, і т.д. Це залежить від Вас.

Висновок


Функції, керуючі PHP висновком, дуже корисні щоб переадресувати висновок скрипта на буфер і потім вже маніпулювати ним. Стиснення буфера для браузерів зменшує час завантаження в 4-5 разів. Це може також використовуватися як caching механізм, щоб полегшити доступ до джерел даних (бази даних або файли) і це може мати значення, якщо ми використовуємо XML.

Думайте про це:

Що, якщо ми будуємо движок в PHP4, використовуючи caching, який бере дані з джерел даних (xml документи і бази даних) і динамічно будує зміст в xml. Ми можемо тоді брати висновок xml і використовувати XSLT, щоб конвертувати до будь-якого виду уявлення, яке ми хочемо (HTML, wap, palm, pdf, і т.д.). PHP4, з контролем виводу і Sablotron XSLT, є досконалим для цієї архітектури. Я написав “Шикарна architectures” – опис, засноване на xml архітектурі, у якої є багато всього, що робити з функціями, описаними в цієї статті. Купуйте, якщо це видано. Я буду також писати статтю про Sablotron XSLT, як тільки це буде зареєстровано і повністю придатним до вживання під PHP4. Шліть мені ваші думки про все, що Ви хочете.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*