Mailinglisten-Archive |
Hallo Tobias, > ich wollte mal nachfragen ob es sich lohnt ein Cache-System auf einer > Seite einzusetzen, die einen Großteil ihrer Funktionen erst nach dem > Login der Benutzer bereitstellt? Ich arbeite mich gerade in Cache_Lite > von PEAR ein. Zwangsläufig müsste ich in der ID des Blocks die SessionId > einbringen. Dies würde allerdings enorm viele Daten im Cache erzeugen. > Lohnt es sich pro Besucher zu Cachen? Es gibt natürlich auch Bereiche > die ihren Inhalt unabhängig vom Besucher generieren (News, Rezept-DB) > allerdings kann ich dann ja die SessionId nicht an die Links anhängen > und müsste voll und ganz auf Cookies setzten um die Session bei einem > Besuch der "gecacheten" Seiten nicht zu verlieren. Ich habe eine Cache Klasse geschrieben, die Requests serialisiert und als MD5 Hash Datei abspeichert. In der Klasse ist auch eine Methode für Aussnahmen, die nicht gecached werden sollen. In meinem Fall alle Sessionbasierten Sites. Die Cache Klasse von PEAR hat bei mir auf dem Produktionsserver nicht immer 100% funktioniert. D.h. machmal wurden die Dateien nicht richtig gecached und die Grösse der Datei war 0B. Desshalb habe ich selbst eine Klasse geschrieben, die 100% funktioniert und auf www.astalavista.com bereits seit 8 Monaten läuft. class cache { var $cacheFilename; var $pageId; var $pageUri; var $cacheDir; var $maxAge; // time in hours var $cacheIsEnabled; function cache($maxAge=24) { $this->pageUri = $_SERVER['REQUEST_URI']; /* $this->pageId = array( "uri" => $this->pageUri, "post" => $_POST, "cookie" => $_COOKIE); */ $this->pageId = array( "uri" => $this->pageUri, "post" => $_POST); // $this->pageId = array( "uri",$this->pageUri); // $this->pageId = $this->pageUri; $this->_checkPermission(); if($this->cacheIsEnabled) { $this->maxAge = $maxAge; $this->cacheDir = 'cached_files/'; $this->cacheFilename = $this->cacheDir.md5(serialize($this->pageId)); //$this->cacheFilename = $this->cacheDir.serialize($this->page); } } function _checkPermission() { global $_CONFIG; $must = array('section','page'); $exceptions = array('newsletter','u=','engine','cmd=submit','dnd','voting'); $this->cacheIsEnabled = TRUE; if(!isset($_CONFIG['enableCaching']) OR !$_CONFIG['enableCaching']) { $this->cacheIsEnabled = FALSE; return ""; } foreach ($must as $val) { if(ereg($val, $this->pageUri) OR $this->pageUri == '/') { foreach ($exceptions as $val) { if(ereg($val, $this->pageUri))// || in_array($val,$_REQUEST)) //if(preg_grep("/$val/", $_REQUEST)) { //print "cache false"; $this->cacheIsEnabled = FALSE; } } } } } function startCache() { if($this->cacheIsEnabled) { if(is_file($this->cacheFilename)) { if( filemtime($this->cacheFilename) > (time() - ($this->maxAge * 60)) ) { readfile($this->cacheFilename); exit; } } else { ob_start(); } } } function endCache() { if($this->cacheIsEnabled) { $cacheContents = ob_get_contents(); ob_end_flush(); if($fp = fopen($this->cacheFilename, 'w')) { if(flock($fp, LOCK_EX)) { fwrite($fp, $cacheContents); flock($fp, LOCK_UN); } fclose($fp); } unset($cacheContents); // check for valid file // the file should be bigger than 2 bytes if($fp = fopen($this->cacheFilename, 'r')) { $testBytes = fread($fp, 3); fclose($fp); if(strlen($testBytes) < 2) { @unlink($this->cacheFilename); } } } return ""; } } Gruss Ivan
php::bar PHP Wiki - Listenarchive