Dvojitá cache - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



PHP

Dvojitá cache

php

17. února 2003, 00.00 | Asi každý webmaster z počátku své kariéry řeší otázku: jak dostat na své stránky
návštěvníky. Nedlouho poté však dochází ke zcela odlišnému problému. Který ovlivní
jednak jeho názor na obsah webových stránek stejně jako způsob jejich vytvoření.

Asi každý webmaster z počátku své kariéry řeší otázku: jak dostat na své stránky návštěvníky. Nedlouho poté však dochází ke zcela odlišnému problému. Který ovlivní jednak jeho názor na obsah webových stránek stejně jako způsob jejich vytvoření.

První otázkou se zabývat nebudu. Ta spíše závisí na dobrém nápadu než na nákladné reklamě. Zato ta druhá myšlenka si rezervuje celý tento článek. V podstatě jednoduchým znakem, který návštěvníkovi ihned naznačuje, jak je daná stránka navštěvovaná je její vzhled. Řekl bych, že mi dáte za pravdu. Protože až na pár výjimek platí rčení, že čím více je daná stránka navštěvovaná, tím méně obsahuje datově tj. graficky náročných prvků. Extravagantní flashe nahradí přehledná tabulka, obrázková tlačítka nahradí CSS apod.

Důvod je velice jednoduchý v podstatě každý hosting (server i web) platí za trafik. To však často není hlavním důvodem pro majetnější společnosti. Kde spíše bývá klasický problém vycházející z aspektu, že odeslat milion 100kB stránek je pro server mnohem náročnější než odeslat stejné množství ve velikosti 10kB.

Takovýto způsob šetření se může projevit na stránkách záměnou aktuálního času za aktuální datum, který je přeci jenom o trochu trvanlivější. Tím se nenápadně přesouvám k části, že typicky opomíjeným způsobem šetření zátěže serveru, v současné době dynamicky generovaných skriptů, bývá hlavička Expires1.

Napadne-li vás v této souvislosti, že s touto hlavičkou se mi přece při načtení takovéto stránky z cache nenačte nový banner, pak se mýlíte. Bannery jsou v současné době často generovány Javascriptem. A pokud čirou náhodou nejsou tj. jsou statické, stačí do vaší stránky vložit IFRAME, u kterého tato hlavička nebude.

Další a to velmi rozšířenou technikou šetření je Output Buffering. Samotný output buffering neznamená nic jiného než prosté za gzipování odesílaných dat (pravděpodobně HTML, CSS či JS). Tento způsob v reálu zmenší odeslaná data na 20 až 25%. Je pravdou, že OB pomáhá zmenšit trafik a tím i trošičku odlehčit serveru. Ale samotné gzipování taky něco spolyká. V konečné fázi OB uvítají spíše klienti, protože gzipovanou stránku procpete českým Internetem dříve než její negzipovanou verzi.

Proto nutně dojdete k nutnosti vytvořit si vlastní serverovou cache. Pro její implementaci budete potřebovat CRON resp. nějakého deamona2, který by např. každých 15 minut vytvořil gzipovanou a negzipovanou verzi stránky(-nek)3.

Od této pozice lze postupovat dvěmi směry podle toho co přesně váš web vyžaduje. V první verzi tyto stránky umístníte na přímo na web. Server k nim přistupuje jako ke statickým stránkám, tudíž ušetříte čas i výkon na spuštění PHP či ASP. Problém však bude se zapnutím Output Bufferingu, kde se musíte spolehnout na nastavení serveru.

Druhý způsob je použitelný pro náročnější weby, které obsahují formuláře. Při spuštění dané stránky se můžete podívat jaký má uživatel jazyk (automaticky ho přesměrovat) či odesílá-li vám nějaká data. Při převládajícím požadavku GET stačí pouze na stránku odeslat readfile('gzip...') a skript ukončit. Pro vyšší rychlost načtení daného skriptu např. PHP je dobré, aby skript samotný byl minimální. Tj. obsahoval pouze podmínky za kterých má něco udělat. U jednotlivých podmínek bude jen readfile(... či require..., kde se daný stav ošetří.

Reálně by to mohlo vypadat asi takto:

<?php
session_start();
$selffile = "index.php";
$filename = "../gzip/index.$_SESSION[lang].gzip";
$filename_html = str_replace('.gzip', '.html', $filename);
// pokud neexistuje HTML soubor se stránkou, vygeneruje se

$post = count($_POST) > 0 || (count($_GET) > 0 && in_array('PHPSESSID', $_GET) == false) || (count($_GET) > 1 && in_array('PHPSESSID', $_GET) == true);
$gzip = !file_exists($filename);
if ($gzip == false) $gzip = filectime($filename) < time() -1*60*60;
if ($gzip) $gzip = !$post;
if ($gzip) {
 ob_start(); // generování obsahu
 $_GET["gzip"] = 'no';
 require "!$selffile";
 $buffer = ob_get_contents(); // funkce vrací obsah bufferu
 $file = fopen($filename_html, "wb"); // uložení obsahu bufferu na disk
 fwrite($file, $buffer);
 fclose($file);
 $zp = gzopen($filename, "wb9");
 gzwrite($zp, $buffer);
 gzclose($zp);
 ob_end_clean();
}

// data se budou posílat gzipovaně
header("Expires: ".gmdate("D, d M Y H:i:s", time()+60*60)." GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s", time()-60)." GMT");
header("Cache-Control: store, cache");
header("Pragma: cache");
if ($post) require "!$selffile";
 else if (strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) {
       header("Content-Encoding: gzip");
       @readfile($filename);
      } else @readfile("$filename_html");
/* ob_start("ob_gzhandler");
 @readfile($filename_html);*/
?>

Tento skript v první řadě zkontroluje, zda nebyl odeslán nějaký formulář. Následně si ověří, zda existuje gzipovaný soubor. Případně ho vytvoří. Vidíte, že obsah daného souboru se requiruje. Následně zapíše hlavičky s expirací a rozhodne se zda předá data na zpracování či přímo zapíše již připravená data na výstup a to buď gzipovaně či standardně, pokud to klient nepodporuje.

A to je zhruba vše. Samozřejmě tento způsob je jen jeden z několika možných řešení. Záleží jen na vás, zda si vymyslíte něco šitého na míru či použijete již něco existujícího.


1. – u dynamických skriptů automaticky nastavena na okamžik vytvoření
2. – či skript samotný
3. – nové požadavky jsou obslouženy starými výstupy

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Java  

 » Rubriky  » Web  

 » Rubriky  » ASP  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: