Key Takeaways
- Abh?ngigkeitsinjektionsbeh?lter (DIC) sind ein wichtiges Instrument zur Aufrechterhaltung von Codebasen in gr??eren PHP -Anwendungen und Frameworks, k?nnen jedoch die Leistung beeinflussen. Einige der bekannten DICs für PHP umfassen PHP-Di, SymfonyDependencyInjection, Zenddi, Ordi, Dice und Aura.di.
- Die Leistung von DICs wird anhand der Ausführungszeit, der Speicherverwendung und der Anzahl der enthaltenen Dateien gemessen. Die letzte Metrik ist besonders wichtig, da sie das Gesamtgewicht einer Anwendung stark beeinflussen kann.
- Unter den getesteten Beh?ltern waren Würfel, Aura und Orno am schnellsten, wobei Würfel die insgesamt schnellsten waren. PHP-DI hatte trotz einzigartiger Merkmale einen erheblichen Leistungsverlust. Symfony schwieriger zu konfigurieren, im Mittelweg durchgeführt und w?re die bevorzugte Wahl für diejenigen, die einen Container aus einem bekannten Projekt suchen.
- Trotz der Leistungsunterschiede sollte die Auswahl eines DIC auch die Konfigurationssyntax und die Funktionen berücksichtigen. Der Leistungsunterschied zwischen Würfel, Aura und Orno ist für jede wirkliche Anwendung vernachl?ssigbar. Daher sollten Entwickler w?hlen, basierend darauf, mit der sie lieber arbeiten würden.
Die meisten Frameworks und gr??eren PHP -Anwendungen verwenden einen Abh?ngigkeitsinjektionsbeh?lter mit dem Ziel einer wartbaren Codebasis. Dies kann sich jedoch auf die Leistung auswirken. Da die Ladezeiten wichtig sind, ist es wichtig, Websites schnell wie nie zuvor zu halten. Heute werde ich mehrere PHP -Abh?ngigkeitsinjektionsbeh?lter bewerten, um zu sehen, wie ihre relative Leistung aussieht.
Für diejenigen, die mit dem Konzept nicht vertraut sind, ist ein Abh?ngigkeitsinjektionsbeh?lter eine Software, die automatisch einen Objektbaum erstellt. Betrachten Sie beispielsweise ein Benutzerobjekt, das eine Datenbankinstanz erfordert.
<span>$user = new User(new Database());</span>
Ein Abh?ngigkeitsinjektionsbeh?lter kann verwendet werden, um den Objektbaum automatisch zu konstruieren, ohne die Parameter manuell bereitzustellen:
<span>$user = $container->get('User');</span>
Jedes Mal, wenn dies aufgerufen wird, wird ein Benutzerobjekt mit dem Datenbankobjekt "injiziert" erstellt.
Es gibt mehrere bekannte (und nicht so bekannte) Beh?lter für PHP:
- php-di, ein beliebter DI-Container
- SymfonyDependencyInjection, der vom Symfony Framework bereitgestellte Abh?ngigkeitsinjektionsbeh?lter
- Zenddi Der von Zend Framework bereitgestellte Abh?ngigkeitsinjektionsbeh?lter
- ornodi, ein weniger bekannter Beh?lter mit begrenzten Merkmalen, aber mit Blick auf die Leistung
- entwickelt Würfel, ein weiterer weniger bekannter Beh?lter mit Schwerpunkt darauf, leicht zu sein. Vollst?ndige Offenlegung, ich bin der Autor dieses Containers, aber ich werde in dieser Analyse geradezu objektiv sein.
- Aura.di, ein ziemlich beliebter Beh?lter mit minimalen Funktionen
A word on Pimple: Although Pimple is advertised as a Dependency Injection Container, retrieving an object from the container always returns the same instance, which makes Pimple a Service Locator rather than a Dependency Injection Container and as such, cannot getestet werden.
Obwohl alle Container unterschiedliche Merkmale unterstützen, wird dieser Benchmark die grundlegende Funktionalit?t abdecken, die durch einen Abh?ngigkeitsinjektionsbeh?lter erforderlich ist. Das hei?t, das Erstellen von Objekten und das Injektieren von Abh?ngigkeiten, an denen sie ben?tigt werden.
Welche Aspekte der Abh?ngigkeitsinjektion werden gemessen?
- Ausführungszeit
- Speicherverbrauch
- Anzahl der enthaltenen Dateien. Obwohl dies nur sehr geringe Auswirkungen auf die Leistung hat, ist dies ein guter Indikator dafür, wie leicht und tragbar eine Bibliothek ist. Wenn Sie aufgrund Ihrer DI -Wahl Hunderte Dateien mit Ihrem Projekt versenden müssen, kann dies das Gesamtgewicht Ihrer eigenen Anwendung stark beeinflussen.
Testumgebung
Alle Tests wurden auf derselben Maschine ausgeführt, die Arch Linux (3.15 Kernel), Php 5.5.13 und die neuesten Versionen jedes Containers ab dem 03.07.2014.
Alle dargestellten Ausführungszeitzahlen sind durchschnittlich 10 L?ufe, nachdem alle über 20% langsamer als die schnellsten abgeworfen wurden.
Test 1 - Erstellen Sie eine Instanz eines Objekts
Dieser Test verwendet jeden Container, um 10.000 Mal ein einfaches Objekt zu erstellen
ohne Abh?ngigkeitsinjektionsbeh?lter würde dies als:
<span>$user = new User(new Database());</span>geschrieben sein
Testcode (auf GitHub): Aura, Würfel, Ordi, Php-Di, SymfonyDependencyInjection, Zenddi
Wie Sie sehen, gibt es hier zwei klare Camps. Aura, Würfel und Orno sind ungef?hr zehnmal schneller als Php-di, Symfony und Zenddi.
?hnlich wie bei der Ausführungszeit gibt es zwei verschiedene Gruppen mit Symfony irgendwo im Mittelweg.
Dies ist sehr aussagekr?ftig darüber, wie leicht jeder Container ist, und geht dazu, die Unterschiede für die Speicherverwendung zu erkl?ren. Es ist zu beachten, dass viele der von Zenddi verwendeten Dateien gemeinsame Framework -Dateien sind. Wenn Sie Zend Framework verwenden, wird die Verwendung von Zenddi nicht denselben Speicheraufwand wie Dateien an anderer Stelle in Ihrer Anwendung wiederverwendet.
In ?hnlicher Weise stützt sich Php-di stark auf Doktrinbibliotheken. Wenn Sie Doktrin in Ihrem Projekt verwenden, wird der Speicheraufwand von PHP-d reduziert.
Es ist jedoch sch?n zu sehen, dass SymfonyDependenzinjektion, obwohl er Teil des Rahmenstapels ist, v?llig eigenst?ndig ist und ohne Abh?ngigkeiten von anderen Symfony -Projekten funktioniert.
Aura, Würfel und Orno haben keine externen Abh?ngigkeiten, und dies hilft dabei, ihre Dateiz?hlungen niedrig zu halten.
Test 2 - Autoloading ignorieren
Da das Laden von Dateien die Leistung beeinflussen kann und sowohl Zend als auch PHP-D eine signifikante Anzahl von Dateien geladen haben, wurde derselbe Test durchgeführt, wobei die Autoloaderzeit ignoriert wurde die Zeit.
Dies kann auch jedes interne zwischen dem Beh?lter durchgeführte interne Caching ausgel?st haben, aber die gleiche Behandlung wurde auf jeden Beh?lter angewendet, um es fair zu halten
?quivalenter PHP -Code:
<span>$user = new User(new Database());</span>
Testcode (auf GitHub): Aura, Würfel, Ordi, Php-Di, SymfonyDependencyInjection, Zenddi
Wie erwartet ist die Speicherverwendung unver?ndert und die Leistung ist etwas besser, da die Autoloaderzeit nicht gemessen wird. Dies zeigt jedoch, dass PHP-DI, selbst das Laden von 42 Dateien einen vernachl?ssigbaren Einfluss auf die Gesamtausführungszeit hat und die relative Leistung gleich bleibt. Das Laden von Dutzenden von Dateien ist nicht die Ursache für PHP-DI und Zenddi mit einer relativ langsamen Leistung.
Auch nachdem der Overhead des Ladens von Dateien ignoriert wurde, gibt es hier noch zwei unterschiedliche Basonparks. Aura, Würfel und Orno sind in Bezug
Alle zukünftigen Tests ignorieren die Autoload -Zeit, um sicherzustellen, dass es wirklich die Leistung des Containers ist.Test 3 - Deep Object Graph
Dieser Test wird durchgeführt, indem die Container diesen Satz von Objekten 10.000 Mal konstruieren:
<span>$user = $container->get('User');</span>Testcode (auf GitHub): Aura, Würfel, Ordi, Php-Di, SymfonyDependencyInjection, Zenddi
Hinweis: Wie Sie den Testcode betrachten k?nnen, ben?tigen Symfony, Php-DI und Aura erheblich mehr Konfigurationscode als die anderen Container, um diesen Test durchzuführen. Die Konfigurationszeit wurde im Test nicht enthalten.
Auch hier gibt es nur sehr geringe Unterschiede zwischen den Top 3, wobei die Würfel 20% schneller als Aura und 70% schneller als Orno sind. Alle drei sind erheblich schneller als Zend, Php-di und Symfony. Der Unterschied zwischen den drei Top -Containern ist so gering, dass Sie den Geschwindigkeitsunterschied au?erhalb eines künstlichen Benchmarks wie diesem nie bemerken würden.
Zend, Php-di und in geringerem Ma?e Symfony sind hier langsam. Zend braucht 37 Sekunden, um eine Aufgabe durchzuführen, die in weniger als 1 Sekunde DICE verwaltet. Sicher kein trivialer Unterschied. Noch einmal übernimmt Symfony die Führung unter den gro?en Namensbeh?ltern.
Speicher- und Dateiz?hlungen stimmen mit dem überein, was wir in anderen Tests gesehen haben.
Test 4 - Abrufen eines Dienstes aus dem Container
DI -Container müssen auch Dienste speichern und abrufen, die w?hrend des gesamten Antrags wiederverwendet werden. Dieser Test holt wiederholt eine einzelne Instanz aus dem Container.
reines PHP -?quivalent:
<span>$user = new User(new Database());</span>
Testcode (auf GitHub): Aura, Würfel, Ordi, Php-Di, SymfonyDependencyInjection, Zenddi
Dies ist aufgrund früherer Ergebnisse unerwartet. Alle Beh?lter mit Ausnahme von Zend und Symfony sind ungef?hr gleich mit nur 0,01s, die die Top 4 -Ergebnisse treten. Symfony ist nicht weit dahinter, aber Zend ist weit über zehnmal langsamer als die anderen.
Speicherverbrauch und Anzahl der Dateienergebnisse werden mit derselben Teilung zwischen den Containern, die wir in der Ausführungszeit gesehen haben, vorhersehbar.
.Test 5 - Injizieren Sie einen Dienst
Der endgültige Test besteht darin, zu sehen, wie schnell ein Objekt konstruiert und einen Dienst injiziert werden kann. Dies nimmt das Format an:
<span>$user = $container->get('User');</span>
Testcode (auf GitHub): Aura, Würfel, Ordi, Php-Di, SymfonyDependencyInjection, Zenddi
Interessanterweise hat Aura in diesem Test einen leichten Vorsprung geführt. Es ist jedoch kein ?hnlicher Test, da Symfony und Aura mehrere explizite Konfigurationslinien erfordern, w?hrend die anderen Container die Abh?ngigkeit automatisch beheben. Die Zeit, die zum Konfigurieren des Containers ben?tigt wurde, war nicht Teil des Benchmarks.
überraschenderweise ist PHP-Di am langsamsten bei dieser Aufgabe, und Zend übernimmt zum ersten Mal seine Position vor PHP-Di und Symfony.
Schlussfolgerung
allein bei der Leistung, Würfel, Aura und Orno sind alle starke Konkurrenten, Würfel sind in der Gesamtfl?che am schnellsten und Aura am schnellsten im endgültigen Test. Der Unterschied zwischen den beiden unterschiedlichen Gruppen ist offensichtlich, aber es ist interessant, die Merkmale jedes Beh?lters zu vergleichen. Anzahl der Funktionen und Leistung korrelieren nicht ganz wie erwartet. Sowohl PHP-DI als auch DICE enthalten einzigartige Funktionen, aber für den PHP-DI erh?lt einen starken Leistungsverlust. Aura erfordert zwar schnell, erfordert eine Menge manueller Konfiguration und hat, wie zu erwarten, sehr minimale Funktionen, w?hrend Würfel und Orno eine sehr ?hnliche Leistung haben, aber viel weniger Code ben?tigen, um zu konfigurieren.
Symfony befindet sich in allen Tests sehr im Mittelweg, obwohl es eine viel schwierigere Aufgabe ist, es wie bei Aura zu konfigurieren, da kein der der beiden Unterstützungsparameter angedeutet wird. Wenn Sie nach einem Beh?lter aus einem bekannten Projekt suchen, muss Symfony der Container der Wahl sein, wenn die Leistung wichtig ist.
, dass es die klaren Gewinner mit Orno sehr nahe dahinter sind, wenn reine Leistung das ist. Es lohnt sich jedoch, sich auf die Konfigurationssyntax und die Merkmale einzelnen zu sehen, mit denen Sie es vorziehen würden, als Leistungsunterschied zwischen Würfel, Aura und Orno für jede wirkliche Anwendung vernachl?ssigbar zu sein.
Alle Code für die Tests finden Sie in GitHub. Bitte beachten Sie: Das Github -Repository enth?lt Kopien der getesteten Bibliotheken, anstatt Komponisten in das Projekt aufzunehmen. Dies soll sicherstellen, dass Sie den Code mit den genauen Versionen ausführen k?nnen, die ich getestet habe, und dieselben Ergebnisse erhalten.
h?ufig gestellte Fragen (FAQs) zu PHP -Abh?ngigkeitsinjektionsbeh?lterleistung Benchmarks
Welche Bedeutung hat die Bedeutung von PHP -Abh?ngigkeitsinjektionsbeh?lterleistung. Diese Benchmarks bieten eine vergleichende Analyse verschiedener Container und helfen Entwicklern, fundierte Entscheidungen darüber zu treffen, welcher Container aufgrund ihrer spezifischen Bedürfnisse verwendet werden soll. Sie bieten Einblicke in die Leistung jedes Containers hinsichtlich des Speicherverbrauchs und des Zeitverbrauchs, die kritische Faktoren für die Optimierung der Leistung von PHP -Anwendungen sind. > Die Abh?ngigkeitsinjektion (DI) in PHP verbessert die Codequalit?t durch F?rderung der losen Kopplung, Verbesserung der Testbarkeit und zunehmender Wiederverwendbarkeit der Code. Durch die Injektion von Abh?ngigkeiten werden die Komponenten unabh?ngiger, wodurch der Code leichter zu ?ndern und zu testen ist. Es f?rdert auch das Prinzip der einzelnen Verantwortung, da jede Klasse nur das tut, was sie tun soll, was zu sauberer und wartbarerer Code führt.
Was sind die verschiedenen Arten der Abh?ngigkeitsinjektion in PHP? In der Konstruktorinjektion werden die Abh?ngigkeiten über einen Klassenkonstruktor bereitgestellt. Die Setter -Injektion beinhaltet die Bereitstellung der Abh?ngigkeiten über Methoden. Die Schnittstelleninjektion erfordert die abh?ngige Klasse, um eine Schnittstelle zu implementieren, die die Abh?ngigkeit injiziert. Container verwaltet die Instanziierung und Konfiguration von Diensten oder Objekten in einer Anwendung. Es fungiert als Fabrik, die für die Erstellung und Rückgabe von F?llen von Abh?ngigkeiten verantwortlich ist. Es verwaltet auch gemeinsame Instanzen und stellt sicher, dass jedes Mal, wenn ein gemeinsamer Dienst angefordert wird Container, berücksichtigen Sie Faktoren wie Benutzerfreundlichkeit, Leistung, Community -Unterstützung und Kompatibilit?t mit Ihrem Projekt. Die Leistung ist besonders wichtig, und hier sind die Performance -Benchmarks von PHP -Abh?ngigkeitseinspritzung nützlich. Sie bieten eine vergleichende Analyse der Leistung verschiedener Container und helfen Ihnen, eine fundierte Entscheidung zu treffen. Abh?ngigkeiten einer Klasse. Auf diese Weise k?nnen Abh?ngigkeiten w?hrend des Tests verspottet oder gestoppt werden, sodass Sie isolierte Klassen testen k?nnen. Es erleichtert auch das Schreiben von Unit -Tests, da Sie Scheinabh?ngigkeiten injizieren k?nnen, die vorhersehbare Antworten liefern, und Ihre Tests zuverl?ssiger und einfacher zu schreiben.
Ja, die Abh?ngigkeitsinjektion kann in jedem PHP -Projekt unabh?ngig von seiner Gr??e oder Komplexit?t verwendet werden. Es ist ein Entwurfsmuster, das Code -Wiederverwendbarkeit, Modularit?t und Testbarkeit f?rdert, was es zu einem wertvollen Instrument für einen PHP -Entwickler macht. Kann aufgrund der zus?tzlichen Abstraktionsschicht einen leichten Overhead einführen, ist der Einfluss auf die Anwendungsleistung im Allgemeinen vernachl?ssigbar. Die Vorteile einer verbesserten Codequalit?t, Testbarkeit und Wartbarkeit überwiegen h?ufig geringfügige Leistungskosten.Wie h?ngt die Abh?ngigkeitsinjektion mit den festen Prinzipien in PHP zusammen? DIP gibt an, dass hochrangige Module nicht von Modulen auf niedrigem Niveau abh?ngen sollten, sondern von beiden von Abstraktionen abh?ngen sollten. Die Abh?ngigkeitsinjektion erm?glicht dies, indem Sie es erm?glichen, Abh?ngigkeiten als Schnittstellen oder abstrakte Klassen zu injizieren, anstatt konkrete Klassen. In einem einzigen PHP -Projekt k?nnen mehrere Abh?ngigkeitseinspritzbeh?lter verwendet werden. Es wird im Allgemeinen nicht empfohlen. Die Verwendung mehrerer Container kann zu Code führen, der schwieriger zu verwalten und zu verstehen ist. Normalerweise ist es besser, einen Container auszuw?hlen, der den Anforderungen Ihres Projekts am besten entspricht und dabei bleibt.
Das obige ist der detaillierte Inhalt vonPHP -Abh?ngigkeitsinjektionsbeh?lterleistung Benchmarks. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

TosecurelyHandleAuthenticationAuthorizationInphp, folge theSteps: 1.Alwayshashpasswordswithpassword_hash () und password_verify (), usePreeParedStatementStopreventsQlinjapitca und StoreuserDatain $ _SessionArtelogin.2.ImplementscaChescescesc

Um Datei -Uploads in PHP sicher zu verarbeiten, besteht der Kern darin, Dateitypen zu überprüfen, Dateien umzubenennen und die Berechtigungen zu beschr?nken. 1. Verwenden Sie Finfo_File (), um den realen MIME -Typ zu überprüfen, und nur bestimmte Typen wie Bild/JPEG sind zul?ssig. 2. Verwenden Sie Uniqid (), um zuf?llige Dateinamen zu generieren und sie im Root-Verzeichnis ohne Web zu speichern. 3.. Begrenzen Sie die Dateigr??e durch Php.ini- und HTML -Formulare und setzen Sie die Verzeichnisberechtigungen auf 0755; 4. Verwenden Sie Clamav, um Malware zu scannen, um die Sicherheit zu verbessern. Diese Schritte verhindern effektiv Sicherheitslücken und stellen sicher, dass der Upload -Prozess des Datei -Uploads sicher und zuverl?ssig ist.

In PHP ist der Hauptunterschied zwischen == und == die Strenge der Typprüfung. == Die Konvertierung des Typs wird vor dem Vergleich durchgeführt, beispielsweise 5 == "5" gibt true zurück und === fordert an, dass der Wert und der Typ gleich sind, bevor True zurückgegeben wird, z. B. 5 === "5" gibt false zurück. In den Nutzungsszenarien ist === sicherer und sollte zuerst verwendet werden, und == wird nur verwendet, wenn die Typumwandlung erforderlich ist.

Die Methoden zur Verwendung grundlegender mathematischer Operationen in PHP sind wie folgt: 1. Additionszeichen unterstützen Ganzfaktoren und Floating-Punkt-Zahlen und k?nnen auch für Variablen verwendet werden. String -Nummern werden automatisch konvertiert, aber nicht für Abh?ngigkeiten empfohlen. 2. Subtraktionszeichen verwenden - Zeichen, Variablen sind gleich, und die Typumwandlung ist ebenfalls anwendbar. 3. Multiplikationszeichen verwenden * Zeichen, die für Zahlen und ?hnliche Zeichenfolgen geeignet sind; 4. Division verwendet / Zeichen, die vermeiden müssen, durch Null zu dividieren, und beachten Sie, dass das Ergebnis m?glicherweise schwimmende Punktzahlen sein kann. 5. Die Modulzeichen k?nnen verwendet werden, um ungerade und sogar Zahlen zu beurteilen, und wenn negative Zahlen verarbeitet werden, stimmen die Restzeichen mit der Dividende überein. Der Schlüssel zur korrekten Verwendung dieser Operatoren liegt darin, sicherzustellen, dass die Datentypen klar sind und die Grenzsituation gut behandelt wird.

Ja, PHP kann mit NoSQL -Datenbanken wie MongoDB und Redis durch bestimmte Erweiterungen oder Bibliotheken interagieren. Verwenden Sie zun?chst den MongoDBPHP -Treiber (installiert über PECL oder Composer), um Client -Instanzen zu erstellen und Datenbanken und Sammlungen zu betreiben, wobei Sie Insertion, Abfrage, Aggregation und andere Vorg?nge unterstützen. Zweitens verwenden Sie die Predis Library oder PHPREDIS-Erweiterung, um eine Verbindung zu Redis herzustellen, Schlüsselwerteinstellungen und -akquisitionen durchzuführen und PHPREDIS für Hochleistungsszenarien zu empfehlen, w?hrend Predis für die schnelle Bereitstellung bequem ist. Beide sind für Produktionsumgebungen geeignet und gut dokumentiert.

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

PHPBECAMEPOPULARFORWebDevelopmentDuetoitSeaseoflearning, Seamlessintegrationwithhtml, weit verbreitete Hostingsupport, andalargeecosystemincludingFrameWorkelaravelandcmsplatformen -?hnliche WordPress.itexcelsinformlingsformen, Managingusesersions, Interacti

Tosettherighttimezoneinphp, usedate_default_timezone_set () functionAtthestartofyourScriptWithAvalididentifiersuchas'america/new_york'.1.usedate_default_timezone_set () beeanydate/timeFununtions.2.Alternativ, konfigurieren
