Zend Framework 2 – classmap_generator sorgt für mehr Geschwindigkeit

SpeedUpZF2

 

Es gibt beim Zend Framework 2 einige Möglichkeiten die Geschwindigkeit zu verbessern. Eine Möglichkeit möchte ich heute zeigen.

Classmap StandardAutoloader

ZF2 läd benötigte Klassen automatisch anhand des Classname „on demand“  indem es versucht den Classname in den Namespace und den eigentlichen Classname zu zerlegen. Aus dem Namespace, Classname, ClassPrefix Seperator, Directory Seperator und der Endung .php wird der eigentliche Dateiname zusammengesetzt. Der Standard Autoloader versucht dann die Klasse unterhalb von ../src zu finden und einzubinden. Für die zerlegung des Classname wird preg_match() und für das erstellen des Dateinamens wird str_replace() benutzt. Beide PHP Funktionen sind nicht gerade die schnellsten.

Was genau dabei passiert kann in der Datei Zend\Loader\StandardAutoloader.php ab Zeile ~250 in der  Funktion transformClassNameToFilename() nachvollzogen werden.

Geschwindigkeit erhöhen durch ClassMapAutoloader

ZF2 bringt einen zusätzlichen Autoloader mit der anders funktioniert. Er findet sich in Zend\Loader\ClassMapAutoloader.php und arbeitet mit einer Key=>Value  LIste in einem Array. Ein Blick in die Klasse zeigt das hier keine aufregenden Dinge geschehen. Es wird ein Array aus einer Quelle eingelesen und in der Klasse vorgehalten. Wenn eine Klasse geladen werden soll wird im Array nach dem Schlüssel geschaut und wenn dieser vorhanden ist wird die Datei eingebunden.

ClassMapAutoloader verwenden

Das einbinden des ClassMapAutoloaders ist recht einfach. Im entsprechenden Modul in der Modul.php (Beispiel: \module\BlogPost\Modul.php) wird der in der Funktion getAutoloaderConfig() der ClassMapAutoloader registriert.

Was hier passiert ist recht Einfach. Wenn jetzt eine Klasse aus dem Modul geladen werden soll, versucht das ZF2 zuerst in der Datei \module\BlogPost\autoload_classmap.php einen entsprechenden Schlüssel im Array zu finden und die Klasse zu laden. Schlägt das fehl weil z.B. der Schlüssel nicht vorhanden ist dann versucht der StandardAutoloader die Datei zu finden.

Die Classmap anlegen

Die Datei autoload_classmap.php (auf der gleichen Ebene wie die Modul.php) ist wie folgt aufgebaut:

Für die Entwicklungsumgebung reicht auch eine Datei mit folgendem Inhalt:

Du erinnerst dich? Genau wenn der ClassMapAutoloader kein Ergebnis liefert benutzt ZF2 den StandardAutoloader.

So was müssen wir tun? Es sollten ALLE Klassen des Moduls in die autoload_classmap.php eingetragen werden. Richtig! Ein haufen Arbeit. Wie gut das sich das ein Entwickler des ZF2 auch gedacht hat. Es gibt nämlich ein kleines Tool welches uns die Arbeit erleichtert.

Unter \vendor\bin findet sich die Datei classmap_generator.php und die Datei classmap_generator.php.bat. Anhand der letzteren zeige ich wie Du schnell unter Windows 7 eine autoload_classmap.php erstellen kannst.

Classmap automatisch erstellen mit dem Classmap Generator

Ich gehe bei der folgenden Anleitung davon aus das der PHP Interpreter im PATH hinterlegt ist, Du mit dem Umgang der Kommandozeile vertraut bist und sich dein vendor Verzeichniss im Root deines ZF2 Projekts befindet.

  • Als erstes öffnest Du eine Kommandozeile
  • in das \vendor\bin\ wechseln
  • classmap_generator.php.bat -l „..\..\module\BlogPost“ ausführen

Der Schalter -l (oder –library) bewirkt das im angegebenen Pfad nach allen vorhanden Klassen gesucht wird. Hieraus wird das Array für die autoload_classmap.php erzeugt. Nach dem ausführen sollte sich im angebenen Modul „BlogPost“ eine autoload_classmap.php befinden welche alle Klassen des Moduls beinhaltet und die dazugehörigen Pfade.

Weitere Möglichkeiten wie das sortieren der Klassen oder das Ignorieren von bestimmten Namespaces kann man sich mit dem Schalter -h anzeigen lassen.

Abschließend

Mit wenigen Handgriffen kann man einen deutlichen Geschwindigkeitszuwachs erreichen. Aber ACHTUNG! Werden es zu viele Klassen im Modul kann es sein das durch die Größe der autoload_classmap.php dieser Geschwindigkeitsvorteil wieder aufgebraucht wird weil diese Datei bei jedem Request eingelesen wird. Ich habe meist Module mit bis zu 50 Klassen und hier kann man einen Geschwindigkeitsvorteil erkennen.

 

 

 

nächster Beitrag

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Section ends here -->