2013-10-20 3 views
8

Ist es besser, Fabrik Klassen oder Schließungen in Zend Framework 2 zu verwenden, und warum?Factory-Klassen vs Verschlüsse in Zend Framework 2

Ich weiß, dass Closures nicht serialisiert werden können, aber wenn Sie sie aus Modul # getServiceConfig() zurückgeben, wirkt sich dies nicht auf die Zwischenspeicherung der restlichen Konfigurationsdaten aus, und die Closures würden ohnehin in Ihrem Opcode-Cache zwischengespeichert.

Wie unterscheidet sich die Leistung beim Erstellen einer Factory-Klasse im Vergleich zum Ausführen eines Abschlusses? Spaltet und instanziert PHP Schließungen nur, wenn Sie sie ausführen, oder würde dies für jede Schließung, die in Ihrer Konfigurationsdatei bei jeder Anfrage definiert ist, geschehen?

Hat jemand die Ausführungszeiten jeder Methode verglichen?

Siehe auch:

Antwort

11

PHP wird die anonymen Funktionen in Ihrer Konfiguration auf Instanzen der Schließung Klasse bei der Kompilierung konvertieren, so dass es das bei jeder Anfrage tun würde . Dies ist im Gegensatz zu create_function, die die Funktion zur Laufzeit erstellen wird. Da Closures dies jedoch zur Kompilierungszeit tun, sollte es sich in Ihrem Opcache-Cache befinden und sollte daher keine Rolle spielen. Im Hinblick auf die Auswirkungen auf die Leistung bei der Konstruktion eines Dienstes mit einer Fabrik vs Schließung erstens müssen Sie daran denken, dass der Dienst immer nur einmal pro Anfrage erstellt wird, unabhängig davon, wie oft Sie nach dem Dienst fragen. Ich lief einen schnellen Benchmark einen Dienst zum Abrufen eines Verschlusses und eine Fabrik mit und hier ist das, was ich bekam (lief ich ein paar Mal und alle Ergebnisse waren etwa den gleichen Wert):

Closure: 0.026999999999999ns 
Factory: 0.30200000000002ns 

Diejenigen ns sind, dh 10 -9 Sekunden. Grundsätzlich ist der Leistungsunterschied so gering, dass es keinen effektiven Unterschied gibt.

Auch ZF2 kann nicht die gesamte Konfiguration meines Moduls mit Closures zwischenspeichern. Wenn ich reine Factories verwende, kann meine gesamte Konfiguration zusammengeführt, zwischengespeichert und eine einfache Datei kann bei jeder Anfrage gelesen werden, anstatt sich um das Laden und Zusammenführen von Konfigurationsdateien jedes Mal kümmern zu müssen. Ich habe den Leistungseinfluss nicht gemessen, aber ich vermute, dass es auf jeden Fall marginal ist.

Allerdings bevorzuge ich Fabriken für hauptsächlich Lesbarkeit und Wartbarkeit. Bei Fabriken gibt es keine riesige Konfigurationsdatei mit vielen Schließungen.

Sicher, Verschlüsse sind ideal für schnelle Entwicklung, aber wenn Sie wollen, dass Ihr Code lesbar und wartbar ist, dann würde ich sagen, bleiben Sie mit Fabriken.

+2

Über die Caching-Sache: Alles mit Schließungen sollte innerhalb 'getXyzConfig()' Ihrer Modul-Klasse gehen. Nur nicht-Schließung-Config innerhalb 'module.config.php';) – Sam

+0

Große Antwort, danke Tom. – darkangel

+2

Ganz zu schweigen davon, dass alle Closures bei jeder Anfrage erstellt werden, aber Factory-Klassen nur dann instanziiert werden, wenn der Service hinter ihnen tatsächlich benötigt wird. – DASPRiD