Sie sind hier : sebastian1012.bplaced.net/ homepage-neu / kreuz-und-quer / tutorials-info-neuigkeiten-php / dateien-performant-einfuegen.php

Dateien performant einfügen

Vor einigen Wochen habe ich verschiedene include-Varianten miteinander verglichen und festgestellt, dass es keine Performance-Unterschiede gibt. Heute möchte ich untersuchen, ob und welchen Unterschied es macht, wenn man die einzufügende Datei absolut oder relativ adressiert.

Die Adressierung von Dateien kann bei der Webprogrammierung stets absolut oder relativ erfolgen, sowohl clientseitig als auch serverseitig. Während auf der Clientseite relative Pfadangaben genutzt werden sollten, um flexibler zu sein (und da der Browser die Pfade sowieso umwandelt, um beispielsweise ein Bild nachzuladen, das relativ referenziert wurde).

Bei der serverseitigen Programmierung gibt der Entwickler selbst an, welche Datei einzufügen ist und auch den Pfad zu dieser Datei. Grundsätzlich habe ich die Pfadangabemöglichkeiten in 3 Varianten unterteilt.
1. Relativ:

include("datei.php");

Diese Variante sieht man am häufigsten. Die einzufügende Datei liegt (meist) im gleichen Verzeichnis wie das aufrufende Script.

2. Semiabsolut (wahrscheinlich heißt das anders, ich habs mal so genannt):

include("./datei.php");

Auch hier liegt die einzufügende Datei im gleichen Verzeichnis wie das aufrufende Script. Das wird eindeutig gekennzeichnet durch das ./ vor dem Dateinamen.

3. Absolut:

include("c:/pfad/zu/datei/datei.php"); //Windows include("/pfad/von/wurzel/datei.php"); //Linux

Hierbei wird der absolute Pfad von der Wurzel des Dateisystems angegeben. Dies ist recht unflexibel, da nach einem möglichen Umzug oder einem Ändern der Verzeichnisstruktur alle include-Befehle angepasst werden müssten (oder man setzt einen symbolischen Link).

Die Ergebnisse
Der Test erfolgte mit 1000 Durchläufen mit je 100 parallelen Aufrufen. Hier die Ergebnisse:

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
include_absolute.php 57.175 s 57.175 ms 100 %
include_semiabsolute.php 83.883 s 83.883 ms 146 % (+46%)
include_relative.php 93.548 s 93.548 ms 163% (+63%)

Die Unterschiede sind doch ziemlich groß. Also wer bisher, wie oben beschrieben, die relative Variante benutzt hat, sollte sich eventuell die Arbeit machen und seine Scripts auf eine der beiden anderen Varianten umschreiben. Ob nun die absolute oder die semiabsolute Variante gewählt wird, hängt auch davon ab, wie flexibel man bei einem möglichen Serverumzug (oder Hosterwechsel) sein möchte. Denn sehr oft hat der neue Server eine andere Ordnerstruktur als der alte und dann würde es schon nicht mehr funktionieren (bzw. müsste ein symbolischer Link gesetzt werden, siehe oben). Wer aber ohne Nachteil seine include-Befehle etwas beschleunigen möchte, der schreibt einfach ./ vor den Dateinamen.

Der Grund für den Geschwindigkeitsunterschied ist, dass die relativen Pfade erst aufgelöst werden müssen, damit die Datei auch wirklich gefunden werden.

PS: Hier habe ich gerade noch ein schönes Snippet gefunden, womit die absoluten Pfade genutzt werden können, ohne dass man so unflexibel wird, wie oben beschrieben:

<?php include $_SERVER['DOCUMENT_ROOT']."/lib/sample.lib.php"; ?>

Das funktioniert, da in der Variable $_SERVER[‚DOCUMENT_ROOT‘] der Pfad zum Dokumentenverzeichnis gespeichert ist (standardmäßig htdocs bei Apache). Hierbei ist zu beachten, dass unter Umständen $_SERVER[‚DOCUMENT_ROOT‘] den trailing slash bereits enthält. Dann muss entsprechend der nachfolgende Slash vor dem Verzeichnis weggelassen werden (hier: include $_SERVER['DOCUMENT_ROOT']."lib/sample.lib.php";), deshalb sollte man den Inhalt zuerst kurz prüfen.
Damit kann also jeder die schnellste include-Variante nutzen und man hat eigentlich keinerlei Nachteile – oder seht ihr welche?
Wie immer freue ich mich auf jede Menge Kommentare.

PS: Diesmal ganz vergessen: Die eingesetzten Scripts.