Die letzten Tage ist mir eine Verhaltensweise des Zend Frameworks aufgefallen, die doch sehr zweifelhaft ist. Es kam unerwartet zu der Exception

Could not determine temp directory,
please specify a cache_dir manually

Der Fehler war schnell gefunden: das temporäre Verzeichnis auf dem Server war nicht gesetzt bzw. war schreibgeschützt. Wie im Zend Framework Issue Tracker nachzulesen ist, wird bei der Verwendung von Zend_Locale und Zend_Translate automatisch ein Cache Objekt erzeugt, welches das temporäre Verzeichnis des Webservers verwendet. Ein aus meiner Sicht sehr zweifelhaftes Verhalten bzw. eine Vorgehensweise, die vielen Kritikern Recht gibt: ohne Caching geht es scheinbar nicht mehr. Laut Thomas Weidner ist das auch nicht mehr erwähnenswert:

Using a false cache will also decrease performance or negotate it completly… but I don’t think that this should be mentioned into this chapter [of the Zend Manual]. Anyone with default knowledge should know this already.
(siehe Issue Tracker ZF-6668, Thomas Weidner)

Ich sehe das an dieser Stelle etwas anders. Caching ist zwar ein wichtiges Mittel und muss hinsichtlich der Performance unbedingt im Auge behalten werden, es aber stillschweigend zu aktivieren, geht aus meiner Sicht doch etwas zu weit.

Um das Problem zu lösen, gibt es mehrere Möglichkeiten:

1. Man setzt die Umgebungsvariable für das temporäre Verzeichnis neu

Das Zend Framework durchsucht die Umgebungsvariablen ‘TMPDIR’, ‘TEMP’, ‘TMP’, ‘windir’, ‘SystemRoot’ (die letzten beiden für Unterverzeichnis ‘/temp’) und übernimmt diese, falls diese gesetzt sind. Abhilfe schafft es also, in der .htaccess


SetEnv TMPDIR data/cache

zu setzen.

2. Man deaktiviert das Caching (was gemäß Thomas Weidner nicht empfehlenswert ist und ich an dieser Stelle auch nicht empfehlen will).

Das Deaktivieren geht sehr einfach mit:


Zend_Translate::removeCache()
Zend_Locale::removeCache()

3. Die beste Methode ist es, ein eigenes Cache Objekt zu setzen und darin einen eigenen Pfad zu definieren. Dazu muss das Frontend Zend_Cache_Core verwendet werden. Dabei wird auf eine statische Methode setCache zurückgegriffen, das heißt die Einstellung gilt dann für alle Zend_Locale oder Zend_Translate Objekte.


$path = APPLICATION_PATH . '/data/cache';
$cache = Zend_Cache::factory(
         'Core',
         'File',
         array(),
         array(
            cache_dir => $path
         ));
Zend_Locale::setCache($cache);
Zend_Translate::setCache($cache);

Ähnliche Beiträge

  1. Zend_Translate fehlende Übersetzungen loggen

9 Kommentare zu “Cache es was es wolle”

  1. robo47

    Danke für die Aufklärung, das erklärt auch die zend-cache-dateien in /tmp bei mir … hatte mich letztens schon etwas gewundert ob die bei irgendwelchen unittests entstanden ist wo ich mit nem anderen cache und anderen pfaden arbeite, weil ich eigentlich nur einen dateibasierten cache habe und der rest in APC liegt.

    Naja, jetzt nutzt Zend_Locale und Zend_Translation meinen Standard-Cache :)

     
  2. Harald Lapp

    zweifelhaft finde ich in der tat auch, dass diese cache dateien im temp-verzeichnis des webservers abgelegt werden, da sie dort meiner meinung nach absolut nichts verloren haben. im falle des zend frameworks fände ich es tatsächlich auch vernünftig, wenn das caching erst über die setCache methode aktiviert wird, so wie du es im letzten code-beispiel gezeigt hast.

     
  3. Master B.

    Lösungsansatz 3 hat mir prompt geholfen!
    Danke für den wertvollen Blog!

     
  4. Ron Maier

    bin Magentofrischling :-)
    hab auch das problem mit dem “fehlenden” Cache/Temp Ordner. Ich hatte gestern noch die Variable in “file.php” nach dem Boardeintrag unter http://www.magentocommerce.com/boards/viewthread/57578/ abgeändert, jedoch wurde heute nach einem Extension-Refresh alles wieder zurückgestellt.
    ich würde gern die 3.Methode probieren, weiß nur nicht, wo bzw. in welcher (Zend) Datei ich das ergänzen soll… Hilfe?
    MfG Ron

     
  5. Tobi

    Hi Ron,

    leider kann ich dir nicht sagen, wo Magento den Cache initialisiert, da ich aktuell keine Installation da habe. Aber direkt in der lib einfach Optionen zu ändern, halte ich für gewagt. In dem Fall würde ich tatsächlich über die SetEnv Option den Pfad anpassen. Das kannst du auch global in der Konfigurationsdatei von Apache machen, oder in einer .htaccess Datei, die global für alle Applikationen auf dem Server gilt (also eine Ebene über dem Magento Verzeichnis). So geht diese Änderung in der .htaccess nicht bei einem Update wieder verloren.

    Viele Grüße
    Tobi

     
  6. Stefan

    Hi Tobi,

    vielen Dank für diesen Beitrag. You made my day.

    Es wurde ja noch gefragt, wo bei Variante 3 die Einstellungen vorzunehmen sind. Ich habe folgende Methode meiner Bootstrap.php hinzugefügt:

    protected function _initCache()
    {
    $path = APPLICATION_PATH . ‘/data/cache’;
    $cache = Zend_Cache::factory(
    ‘Core’,
    ‘File’,
    array(),
    array(
    ‘cache_dir’ => $path
    ));
    Zend_Locale::setCache($cache);
    Zend_Translate::setCache($cache);
    Zend_Currency::setCache($cache);
    }

     
  7. Stefan

    Noch ein Nachtrag:
    Du setzt cache_dir nicht in Anführungszeichen. Das führt dazu, dass hier von einer Konstante ausgegangen wird.
    Evtl. etwas verwirrend.

     
  8. Tobias

    Hallo!
    Methode 3 hat mir den Tag gerettet :) Ich bin neu im Zend Framework und muss sagen, dass ich das mit dem Cache nicht logisch nachvollziehen kann.. Danke Stefan für die Methode der bootstrap.php.

     
  9. PHP Fat-Free Framework - Tobis Blog

    [...] Es gibt ja eine ganze Fülle an PHP Frameworks und jedes wartet mit seinen ganz eigenen Vor- und Nachteilen auf. Für rsslounge habe ich das Zend Framework gewählt und bereue diese Entscheidung nicht, denn es bietet eine Vielzahl an sehr nützlichen Funktionen und sorgt für eine saubere und aufgeräumte Struktur. Ein gravierender Nachteil ist allerdings die Größe und die hohe Anzahl an Dateien, die das Framework mit sich bringt. Für ein Webprogramm, das anderen zur Verfügung gestellt werden soll und die dies dann auf einen eigenen Server hochladen sollen, ist das ziemlich lästig. Hinzu kommt doch eine gewisse Komplexität, wie man beispielsweise am Cachingverhalten sieht. [...]

     

Hinterlasse eine Antwort