Das Zend Framework etabliert sich langsam zum Framework der Wahl für PHP Applikationen. Doch gerade wenn noch nicht so viele Erfahrungen vorlieren, kann es passieren, dass der Eindruck entsteht das Zend Framework sei noch nicht reif für den Produktiveinsatz, Bugs oder Performance Probleme bei dem „großen“ Zend Framework werden hier schonmal als Gründe für die home-grown-Lösung genannt.

Für einen Kunden entstand eine Anwendung, die Produktdaten für verschiedene Länder verwaltet. Dabei standen pro Produkt Daten (wie Preis und Größe) und lokalisierte Beschreibungstexte zur Verfügung.
Die Produkt Daten sollten in einer lokalisierten Form angezeigt werden, dabei Preise natürlich landestypisch formatiert werden. (z.B. 95.20 US-Dollar oder 95,20 Euro)
Bei Performance Tests kam jedoch zum Vorschein, dass die Anwendung zu langsam arbeitete – von Skalierung ganz zu schweigen.
Das Ergebnis einer PHP Profiling Sitzung war dann relativ ernüchternd: Nicht die eigene Programmierung, sondern ein Teil des Zend Frameworks verheizte tüchtig Rechenzeit. Dabei handelte es sich um den Teil, der die Lokalisierung vornimmt. (Ein Blick in den Source des Zend Frameworks verrät hier, dass auch tatsächlich „viel“ passiert – unter anderem das Parsen von XML Dateien, die die Lokalisierungsregeln enthalten.)

Wie in der mittelt Jmeter generierten Auswertung zu sehen, braucht eine einzelne Seite über vier Sekunden bis sie ausgeliefert werden kann. Das ist gelinde gesagt unerträglich.
Um ein Gefühl dafür zu bekommen, wie teuer das Lokalisieren ist, und wie viel der Rest der Anwendung ausmacht, wurde die Lokalisierung ausgebaut und erneut getestet.

Eine halbe Sekunde – das ist durchaus erträglich, zumal die Datenbank auf einem entfernten Rechner liegt und es sich hierbei nicht um die Produktivumgebung handelt.
Eine Lösung hat die Verwendung des ebenfalls durch das Zend Framework angebotene Caching Moduls aufgezeigt.

Der Einbau ist auch erstaunlich einfach – hier am Beispiel eines File-Caches (also der Cache wird auf Festplatte gehalten) der dem Zend Translate bekannt gegeben wird:

$cache = Zend_Cache::factory(‚Core‘, ‚File‘, array(‚lifetime‘ => 1200, ‚automatic_serialization‘ => true), array(‚cache_dir‘ => ‚../application/cache/‘));
Zend_Locale::setCache($cache);

Allein diese beiden Zeilen ändern das Laufzeitverhalten der Anwendung enorm:

Rund 800 Milisekunden pro Request dieser speziellen Art. Sicherlich stell das erst den Anfang von Performance Tuning im Zusammenhang mit dem Zend Framework und der eigenen Anwendung dar – so günstig bekommt man aber selten zusätzliche Performance geschenkt.