phpbar.de logo

Mailinglisten-Archive

[php] Cachesysteme und Sessions

[php] Cachesysteme und Sessions

Swiss4.com webmaster at swiss4.com
Mit Jun 23 18:41:33 CEST 2004


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