Verbesserungsvorschläge Cache-Klasse

ZodiacXP

Erfahrenes Mitglied
Hallo.

Soeben habe ich mir eine Klasse geschrieben, die sich wie ein Cache verhält.

Als Beispiel: Ein Template hat immer die selben Variablen für die Übersetzung drin.
Statt hier erst alle per preg_match() o.ä. rauszufischen und dann per SQL zu fragen wie denn die übersetzung ist, kann man auf den Cache zugreifen (sofern dort das Ergebnis einmalig gespeichert wurde).

Man kann alles speichern was var_export() auch erstellen kann.

Lange Rede kurzer Sinn. Hier ist die Klasse und ich wüsste gerne was ihr davon haltet oder verbessern würdet:

PHP:
<?php
/**
 * Cache your variables
 *
 * LICENSE: This source file is subject to
 * "Attribution-Noncommercial-Share Alike 2.0 Generic" license
 * that is available through the world-wide-web at the following URI:
 * http://creativecommons.org/licenses/by-nc-sa/2.0/
 * If you are unable to obtain it through the web, please send a
 * note to zodiacxp@web.de so I can mail you a copy.
 *
 * 2008/08/23
 * @category   Cache
 * @author     ZodiacXP
 * @copyright  ZodiacXP
 * @license    by-nc-sa http://creativecommons.org/licenses/by-nc-sa/2.0/
 * @version    1.0.0
*/

class Cache
{

  private $aCache = array();

  private $_add = "";

  function __construct()
  {
    $this->_add = "_cache".$_SERVER["REQUEST_URI"];
    if (func_num_args() != 0) $this->_add .= "/".implode("/", func_get_args());
  }

  function __get($var) {
    if (!isset($this->aCache[$var]) && file_exists($this->_add.$var.".tmp"))
      eval('$this->aCache[$var] = '.@file_get_contents($this->_add.$var.".tmp").';');

    return $this->aCache[$var];
  }

  function __set($var, $val)
  {
    if(!is_dir($this->_add)) mkdir($this->_add, NULL, true);
    file_put_contents($this->_add."/".$var.".tmp", var_export($val, true));
    $this->aCache[$var] = $val;
  }
}
?>
 
Zuletzt bearbeitet:
Irgendwie ist das für mich keine Caching Klasse, sondern ein Register für Variablen.

Hauptsinn von einem Cache ist es doch dynamisch generierte Inhalte für eine gewisse Zeit statisch zu speichern... Bei dir ist aber keinerlei Zeitüberprüfung integriert.
 
So hab ich das auch gerade gesehen (wie Felix) ...
Und du musst doch ab und zu auch automatisch noch überprüfen ob die Einträge noch aktuell sind
 
An die Zeit hab ich kein Stück gedacht, da es im Testprojekt egal war.
Also hier nochmal mit Zeit und die Datei wird gelöscht wenn eine variable 0 oder "" ist :
PHP:
<?php
/**
 * Cache your variables
 *
 * LICENSE: This source file is subject to
 * "Attribution-Noncommercial-Share Alike 3.0 Unported" license
 * that is available through the world-wide-web at the following URI:
 * http://creativecommons.org/licenses/by-nc-sa/3.0/
 * If you did not receive a copy of the license and are unable to
 * obtain it through the web, please send a note to zodiacxp@web.de
 * so I can mail you a copy.
 * Put this always visible and reachable on your page:
 * Cache-Class 1.1.0 (c) ZodiacXP
 *
 * 2008/08/29 - zodiacxp
 * @category  Cache
 * @author    ZodiacXP
 * @copyright  ZodiacXP
 * @license    Attribution-Noncommercial-Share Alike 3.0 Unported
 * @link    http://creativecommons.org/licenses/by-nc-sa/3.0/
 * @version    1.1.0
*/

class Cache
{

  public $_iLifetime = 1800;

  private $_aCache = array();

  private $_add = "";

  function __get($var) {
    if (isset($this->_aCache[$var])) return $this->_aCache[$var];

    $sFile = $this->_add.$var.".tmp";
    if (!file_exists($sFile) || (time() - filectime($sFile)) > $this->_iLifetime)
      return NULL;

    $this->_aCache[$var] = unserialize(file_get_contents($sFile));
    return $this->_aCache[$var];
  }

  function __construct()
  {
    $this->_add = "_cache".$_SERVER["REQUEST_URI"];
    if (func_num_args() != 0) $this->_add .= "/".implode("/", func_get_args());
  }

  function __set($var, $val)
  {
    if(!is_dir($this->_add)) mkdir($this->_add, NULL, true);
    if ($val)
    {
      file_put_contents($this->_add."/".$var.".tmp", serialize($val));
      $this->_aCache[$var] = $val;
    }
    else
    {
      unlink($this->_add."/".$var.".tmp");
      $this->_aCache[$var] = NULL;
    }
  }

}

?>
 
Am deutlichsten wird es beim Übersetzen.
Ich hab zwei Tabellen:
tagID | tag
1; ISO
2; Welcome

tagID | langID | text
1; 49; de
2; 49; Willkommen
...usw

Und aus einer Seite werden alle {lang...} herausgefiltert und daraus ein Query gemacht, um die Übersetzungen für eine Sprache zu haben.
Das kürzt man dann durch die Cache-Klasse ab.

PHP:
$LangCache = new cache($iLanguageID);
// gibt's das gesuchte schon im cache?
if (!$LangCache->arrReplace)
{
  // einmalig rausfiltern und der query
  // ergebnisse speichern in $LangCache->arrReplace
}

$sContent = strtr($sContent, $LangCache->arrReplace);

Damit soll die Seite schneller werden.
 
Zurück