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);
20. August 2009 um 14:44 Uhr
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
10. September 2009 um 20:34 Uhr
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.
5. März 2010 um 07:20 Uhr
Lösungsansatz 3 hat mir prompt geholfen!
Danke für den wertvollen Blog!
30. März 2010 um 16:37 Uhr
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
30. März 2010 um 17:05 Uhr
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