Jak zrychlit Váš web 10x? (konkrétní návod)
Uvedené řešení předpokládá, že Váš web je generován dynamicky, v tomto případě docílíte skutečně cca 10-ti násobného zrychlení Vašeho webu, nicméně, díky zde uvedeným algoritmům je zrychlení 3-4 násobné i po statické XHTML stránky.
V čem spočívá tento algoritmus? Nejdříve, proveďte kompresi Vašeho CSS a JavaScriptu, jak píšu v předchozím článku.
Následně přistoupíme ke kompresi online generovaných PHP stránek, a k vytváření XHTML statických variant stránek, a to plně automaticky.
Pro 10x rychlejší web Vám potom postačí, když na začátku Vaší stránky uvedete následující:
<?php $statickeXHTML = new Cache(); $statickeXHTML->start(); ?>
A na konci následující:
<?php $statickeXHTML->finish(); ?>
Jednoduché, ne?
Vlastní implementace třídy Cache používá knihovnu Cache_Lite, takže si ji nejdříve stáhněte. Třída Cache je napsána tak, že automaticky pozná název souboru z URL, podívá se, zda tento souboru existuje v cache, a následně, pokud statický soubor již existuje, jej vypíše a skončí, případně, pokud ne, zachytí výstup a uloží jej do cache a opět vypíše.
Třída Cache je rovněž schopna podporovat GZip kompresi. Navíc, Cache vypisuje do vytvářených stránek různé statictické údaje. K dispozici jsou následující texty:
- CACHEX_PARSE_TIME - jak dlouho trvalo vytvoření stránky.
- CACHEX_CREATED_TIME - jak je stará cache.
- CACHEX_USING_GZIP - zda stránka používá GZip kompresi.
- CACHEX_DATA - zda jsou zobrazena data z cache, či čerstvá.
Celý systém funguje plně automaticky.
A zde je daná třída Cache, vzhledem k tomu, že je kvalitně komentována přímo v kódu, více ji nepopisuji:
<?php require('Lite.php'); class Cache_Lite_Output extends Cache_Lite{ function Cache_Lite_Output($options){ $this->Cache_Lite($options); } function getmicrotime(){ list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } function startcache($id, $group, $gzip){ $this->starttime=$this->getmicrotime(); // existuje data stranka? $data = $this->get($id, $group); if ($data !== false) { // zapni GZip if ($gzip==1) if (function_exists('ob_get_level') && (ob_get_level() > 0)) { $obStarted = ob_start("ob_gzhandler"); $data=str_replace('CACHEX_USING_GZIP','ano',$data); } $data=str_replace('CACHEX_USING_GZIP','ne',$data); // jak dlouho se cache tvorila? $time = $this->getmicrotime()-$this->starttime; $time= strval(floatval(intval($time*100000))/100000); $data=str_replace('CACHEX_PARSE_TIME',$time,$data); // data z cache? $data=str_replace('CACHEX_DATA','ano',$data); // vypsani dat echo($data); // zastav GZip if ($obStarted) ob_end_flush(); return true; } else { // zacni zachytavat vystup ob_start(); ob_implicit_flush(false); return false; } } function endcache($date, $gzip){ // vystup $data = ob_get_contents(); ob_end_clean(); // kdy se cache vytvorila? $data=str_replace('CACHEX_CREATED_TIME', date($date,time()),$data); // ulozeni dat $this->save($data, $this->_id, $this->_group); // jak dlouho se cache tvorila? $time = $this->getmicrotime()-$this->starttime; $time= strval(floatval(intval($time*100000))/100000); $data=str_replace('CACHEX_PARSE_TIME',$time,$data); // GZip if ($gzip==1) if (function_exists('ob_get_level') && (ob_get_level() > 0)){ $obStarted = ob_start("ob_gzhandler"); $data=str_replace('CACHEX_USING_GZIP','ano',$data); } // data z cache? $data=str_replace('CACHEX_USING_GZIP','ne',$data); $data=str_replace('CACHEX_DATA','ne',$data); // vypsani dat echo($data); // zastav GZip if ($obStarted) ob_end_flush(); } } class Cache { function Cache(){ // volby cache $this->url = '/'; // url kde se vytvari cache $this->minut = 30; // expirace cache $this->gzip=true; // GZIp povolen? $this->date='H:i:s, d.m.y'; // format data $this->group='skupina'; // skupina stranek $this->options = array( 'cacheDir' => $this->url, 'lifeTime' => 60*$this->minut, 'fileLocking' => true, 'fileNameProtection' => false ); // nazev souboru v cache $this->id=$_SERVER['REQUEST_URI']; // ignoruj anchory if (strpos($this->id,'#')!==false) $this->id=substr($this->id,0,strpos($this->id,'#')); // jen ASCII preg_match_all('/[a-zA-Z0-9]+/', $this->id, $n); $this->id = implode('-', $n[0]); if (empty($this->id)) $this->id='rootdir'; // soubory budou koncit na html $this->id.='html'; } function start(){ // spust cache $this->cache = new Cache_Lite_Output($this->options); if ( $this->cache->startcache( $this->id, $this->group, $this->gzip ) ) die; } function cleanCurrentPage(){ // smaze aktualni stranku z cache $this->cache = new Cache_Lite_Output($this->options); $this->cache->remove($this->id,$this->group); } function cleanAll(){ // smaze celou cache $this->cache = new Cache_Lite_Output($this->options); $this->cache->clean($this->group); } function finish(){ $this->cache->endcache($this->date,$this->gzip); } } /********* spusteni cache ************/ $statickeXHTML = new Cache(); $statickeXHTML->start(); /********* spusteni cache ************/ ?> <html><body> <ul> <li>stranka vytvorena za: CACHEX_PARSE_TIME s</li> <li>vytvorena v: CACHEX_CREATED_TIME</li> <li>pouziva GZip: CACHEX_USING_GZIP</li> <li>data z cache: CACHEX_DATA</li> </ul> </body></html> <?php /********* ulozeni cache ************/ $statickeXHTML->finish(); /********* ulozeni cache ************/ ?>
Povšimněte si, že kromě metod cache->start() a cache->finish() můžete používat i metody cache->cleanCurrentPage() pro znevalidnění cache pro aktuální stránku, a cache->cleanAll() pro smazání celé cache.
Síla této cache je v tom, že XHTML statické stránky se tvoří dynamicky, až dle potřeby, není tedy nutné nic předgenerovávat! Rovněž automaticky se zapíná GZip komprese pro ty koncová zařízení, která ji podporují (což třeba nejsou RSS čtečky; nicméně zde je přínos ve vytváření statického XML!).
Velice podstatné zrychlení Vašich stránek se tak stává mimořádně triviální věcí. Postačí doplnit do Vašeho systému 3 řádky kódu. :)
Dobrá stránka pro page kompresi.
http://www.desilva.biz/gzip-test.php...