PHP-Dateien in andere Scripts einbinden

Damit eine gewisse Skalierbarkeit von Webanwendungen gewährleistet werden kann, werden Dateien mit globalen Einstellungen und Funktionen gern in eine eigene PHP-Datei ausgelagert. Dies erspart Arbeitsaufwand bei Änderungen (Änderungen müssen nur in 1 Datei durchgeführt werden statt in allen) und senkt auch die Dateigröße, wobei erstgenannter grund wesnetlich bedeutsamer ist. Für das Einfügen dieser ausgelagerten Dateien bietet PHP mehrere Möglichkeiten an – diese möchte ich in diesem Beitrag vorstellen.

Auch dieser Beitrag entstand durch eine Anregung in den Themenvorschlägen – diesmal ein Vorschlag von workerholic.

Es gibt 4 Varianten per PHP eine externe Datei in ein anderes Script zu laden. Diese bieten jeweils eine leicht unterschiedliche Funktionsweise.

1. include und require
Beide Funktionen laden eine als Parameter übergebene Datei. Der einzige Unterschied liegt in der Fehlerbehandlung. Während include() bei Fehlern wie einer fehlenden Datei lediglich einen Fehler vom Typ E_WARNING auslöst, bricht require bei Fehlern mit einem Fatal Error (E_ERROR) das Script sofort ab. PHP.net bringt es auf den Punkt:

Mit anderen Worten, verwenden Sie require(), wenn Sie möchten, dass eine fehlende Datei die Ausführung ihres Skripts beendet. include() verhält sich anders, ihr Skript wird weiterhin ausgeführt.

2. include_once und require_once
Für diese beiden gilt das gleiche wie bei 1., jedoch mit einem Unterschied: Bei größeren Projekten kann es leicht passieren, dass man durch mehrere Auslagerungen von Programmkomplexen oder durch eine unübersichtliche Anwendungsarchitektur eine Ressourcen-Datei mehrmals lädt. include() und require() brechen dann sofort ab, weil sie merken, dass die Funktionen schon einmal deklariert wurden (das wäre das gleiche, wie wenn man 2 Funktionen mit dem gleichen Namen in dieselbe Datei schreibt).
include_once und require_once verhindern solche Fehler aber, indem die übergebenen Dateien nur einmalig geladen werden (wie der Name schon sagt: once). Das erhöht durchaus den Komfort bei Großprojekten, da nicht penibel darauf geachtet werden muss, ob eine Datei über 4 Ecken schon einmal eingefügt wurde.
Die Frage ist nur: Zu welchem Preis erreicht man dieses Plus an Komfort?

Ich habe die 4 Varianten durch ein Testscript laufen lassen, in dem erst eine Ressourcen-Datei eingefügt wurde und anschließend eine darin enthaltene Funktion aufgerufen wurde.

<?php  
include("datei.php"); 
//oder eben die anderen 3 Varianten  
funktion(); 
//diese Funktion wird in datei.php implementiert 
 ?>

Zum Test habe ich eine Bibliothek von 18 kB Größe genutzt. Das Ergebnis sieht folgendermaßen aus:

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
result_include.php 23.643998 s 236.440 ms 100 %
result_require_once.php 23.714100 s 237.141 ms 100 %
result_include_once.php 23.754157 s 237.542 ms 100 %
result_require.php 23.774186 s 237.742 ms 101 % (+ 1%)

Es wird deutlich, dass sich die Varianten kaum unterscheiden in der Geschwindigkeit. Der zusätzliche Komfort bei den *_once-Varianten kostet also keinerlei Performance.

Meine Empfehlung geht deshalb in Richtung require_once, weil sie den besagten Zusatzkomfort bietet (sich also gegen die Gefahr der Mehrfachinklusion wendet) und außerdem abbricht, wenn die Datei nicht gefunden wird. Denn eigentlich möchte ich das entsprechende Script ja mit dem Ziel laden, dass ich später mit den darin enthaltenen Funktionen weiterarbeiten kann. Sind diese nicht da, ist das oft nicht sinnvoll möglich.


Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0