9.4 Caching von Übersetzungen 

Sie mögen die nicht ganz unberechtigte Befürchtung hegen, dass das Erfragen der Übersetzungen bei jedem Request an Ihre Applikation aus den XML-Übersetzungsdateien einen spürbaren Performance-Nachteil mit sich bringt.
In Abschnitt 1.2.2, »Was sind eZ Components?«, wurde das Konzept der Tieins vorgestellt, mit denen sich Komponenten verknüpfen beziehungsweise ihre Funktionalitäten kombinieren lassen. Für die Beschleunigung der Translation-Komponente existiert das ezcTranslationCacheTiein, das ein Translation-Cache-Backend zur Verfügung stellt, mit dem sich die einmal abgefragten Übersetzungen cachen lassen.
Das folgende Beispiel integriert das Cache-Backend in die Applikation:
try
{
$cacheObj = new ezcCacheStorageFileArray(
dirname( __FILE__ ) . '/../cache/translations'
);
$cacheBackend = new ezcTranslationCacheBackend( $cacheObj );
$manager = new ezcTranslationManager( $cacheBackend );
$translationContext = $manager->getContext(
$locale, $context
);
$translated = $translationContext->getTranslation( $string, $replacements );
}
catch ( ezcTranslationException $e )
{
// Use TSBackend
// ...
}Listing 9.13 Übersetzungen cachen
Um dies zu erreichen, initialisieren wir das Cache-Backend, bevor auf das TSBackend zugegriffen wird. Wir verwenden es nur dann, falls die Übersetzung im Cache-Backend nicht zu finden ist. Dies war in obigem Beispiel an der Position des Kommentars // Use TSBackend der Fall.
Die Verwendung des Cache-Backends gestaltet sich sehr ähnlich dem bereits bekannten TSBackend. Allerdings muss hier ein Pfad für den Cache angegeben werden, der durch den Webserver schreibbar sein sollte, anstelle des nur lesbaren Pfades zu den Übersetzungsdateien. In dem Fall, dass die Übersetzung nicht oder nur in den Dateien gefunden wurde, soll der Cache aktualisiert werden. Dazu fügen wir den folgenden Code nach dem Erhalt der Übersetzung hinzu.
// Update translation cache
$reader = $fileBackend;
$reader->initReader( $locale );
$writer = $cacheBackend;
$writer->initWriter( $locale );
foreach ( $reader as $contextName => $contextData )
{
$writer->storeContext( $contextName, $contextData );
}Listing 9.14 Übersetzungen in den Cache schreiben
Um alle Übersetzungen aus einem Backend auszulesen, muss ein Translation-Reader auf diesem initialisiert werden. Da aus dem TSBackend gelesen werden soll, wird dieser auf dem $fileBackend initialisiert. Auf dem $cacheBackend wird der Translation-Writer initialisiert, da in den Cache die im TSBackend vorhandenen Übersetzungen gespeichert werden sollen. Anschließend kann über die Kontexte aus $reader mittels foreach() iteriert werden und in $writer gespeichert werden.
Bei dem darauf folgenden Request werden die Übersetzungen nun erheblich schneller aus PHP-Arrays ausgelesen und der Applikation zur Verfügung gestellt. Wenn von einem Übersetzer Änderungen an den Übersetzungsdateien vorgenommen worden sind, müssen nun aber die Caches geleert werden, was entweder durch ein einfaches Entfernen aller Dateien in cache/translations möglich ist oder durch die Methoden, welche die Cache-Komponente dafür zur Verfügung stellt und somit eine bessere Kontrolle über die Cache-Einträge bietet.




Ihre Meinung






