Gibt es bei der Verwendung von Autoloading-Klassen in PHP Leistungseinbußen?

8

Zur Zeit lade ich alle meine Klassen ein, indem ich eine "all.inc.php" -Datei auf jeder Seite meiner Site einfüge. Diese Datei enthält dann alle Configs, Klassen, Funktionen usw., auf denen ich arbeiten werde die ganze Seite.

Mein Problem dabei ist, dass ich oft Klassen verwende, die nur bestimmte Seiten / Bereiche einer Webseite betreffen, so dass ich oft eine Reihe von Klassen am Anfang der Seite einschließe, die nicht verwendet werden.

Offensichtlich würde das Autoloading der Klassen dieses Problem beheben, also ist meine Frage, würde das automatische Laden der Klassen mir einen Performance-Nachteil geben, da der Server dann prüfen muss, ob eine Datei existiert? Und wenn es einen Nachteil gibt, ist dieser Nachteil dann schlimmer als eine Anzahl von Klassen, die nicht auf der Seite verwendet werden können? Oder ist der Unterschied negierbar?

    
Nick 23.11.2011, 10:37
quelle

5 Antworten

9

Dieser Artikel enthält einige Informationen und Benchmarks: PHP-Autoload-Leistung . Fazit:

  

Autoloading beeinträchtigt die Leistung nicht wesentlich. Include_path Nachschlagen, Lesen und Parsen von PHP-Skripten von der Festplatte dauert viel länger als die Kosten für die Autoloading-Logik.

    
Gfox 23.11.2011, 10:41
quelle
5

Das automatische Laden einer Klasse ist fast so schnell wie das normale Einbinden der Klasse. Das Umschalten auf Autoloading verbessert die Leistung in Ihrem Fall, da PHP weniger Dateien und Klassen lädt.

    
Sjoerd 23.11.2011 10:39
quelle
3

Autoloading verbessert die Leistung, wenn das Skript die Dateien nicht jedes Mal im Dateisystem durchsuchen muss. Wenn Sie Namespaces verwenden, können Sie den Namespace und den Klassennamen in einen Ordner mappen, und eine Datei wie Some / Nice / ClassName würde Some / Nice / ClassName.php zuordnen.

Wenn Sie keine Namespaces verwenden und Ordner durchsuchen müssen, empfehle ich Ihnen, eine benutzerdefinierte Singleton-Klasse zu erstellen, die Dateien enthält, mit denen Sie beispielsweise Folgendes tun können:

App :: verwendet ('Some / Nice', 'ClassName');

In Autoload verwenden Sie den registrierten Pfad und den Klassennamen, um ihn einem Pfad und einer Datei zuzuordnen, die beide Argumente der uses-Methode in meinem Beispiel kombinieren. Dadurch erhalten Sie einige Namespace-ähnliche Funktionen zum Laden von Klassen, bis Sie Ihre App so konfigurieren können, dass sie Namespaces verwendet.

    
burzum 23.11.2011 10:46
quelle
2

Sie sollten Autoloading mit dem Cache-Index aller verfügbaren Klassen / Dateien im Projekt verwenden.

Beispiel:

%Vor%

Sie müssen die Klassenliste aktuell halten oder einen Generator für $ class_cache schreiben.

    
rogal111 23.11.2011 10:50
quelle
1

Jede include() und require() (und ihre _once Geschwister) haben eine Leistungseinbuße für sich. Das Suchen und Lesen von Datenträgern hat auch ihren Preis. Es hängt wirklich von deinem Code ab, wenn du 20 Klassen lädst, aber nur 2 oder 3 an einem einzelnen Punkt verwendest, dann ist es definitiv die Autoloading-Route wert.

Wenn die Leistung Ihr Hauptanliegen ist, sollten Sie Ihre Klassendateien in einer einzigen Datei zusammenführen und instanziieren, was Sie brauchen.

    
code_burgar 23.11.2011 10:43
quelle

Tags und Links