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.
Ü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
Große Antwort, danke Tom. – darkangel
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