Zend Framework und PHP: Beschleunigung durch Caching
Linux/OpenSource, PHP Dezember 21st, 2007Das 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.
Dezember 21st, 2007 at 21:03
interessant. Wenn ich nur endlich die Zeit fürs ZFF finden würde :-/
Dezember 22nd, 2007 at 01:37
Ein Einstieg in das Zend Framework ist meines Erachtens in 4-6 Stunden gut zu meistern. (Zugegeben, Java Erfahrung und generelle PHP Erfahrung ist dem sicherlich nicht abträglich.)
Juni 28th, 2008 at 13:42
everflux – warum bitte sollte man Java Erfahrung mitbringen?
Als intensiver Javanutzer sehe ich den Zusammenhang leider nicht – was u.a. daran liegen mag, das PHP mit OOP nicht sonderlich viel zutun hat..
Juni 28th, 2008 at 14:52
Man kann das Zend Framework meines Erachtens leichter erlernen, wenn man mit Servlets – oder auch anderen Web-Frameworks – Erfahrungen hat. Ich wollte nicht zum Ausdruck bringen, dass Java Erfahrung eine Voraussetzung zum Erlenen des Zend Frameworks ist.
März 4th, 2010 at 17:22
[…] Weitere Quellen: PHP Performance Profiling Benchmarking PHP: eAccelerator und andere OpCode Caches eAccelerator vs. xcache: Caches für PHP Zend Framework und PHP: Beschleunigung durch Caching […]