PHP Include vom Root

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Wenn ich Bilder referenziere, mache ich fast immer etwas wie das hier

<img src="/images/logo.png" alt="logo">

Das ist ein relativer Dateipfad, aber er beginnt im Root-Verzeichnis der Website. So referenziert er immer denselben Ort, egal in welchem Verzeichnis sich der Code-Schnipsel befindet. Wenn er nicht mit diesem „/“ beginnen würde, wäre es immer noch ein relativer Dateipfad, aber der Ort würde davon abhängen, in welchem Verzeichnis Sie sich gerade befinden. Es könnte gut funktionieren, wenn Sie sich unter /index.php befinden, aber wenn das zu /contact/ verschoben wird, bricht der Dateipfad, weil sich der *Bilder*-Ordner im Root befindet und nicht in /contact/.

Gesunder Menschenverstand.

Aber das wird bei einer serverseitigen Sprache wie PHP etwas komplizierter. Sie können auch Includes mit PHP wie folgt machen

<?php include("header.php"); ?>

Da es nicht mit „/“ beginnt, leidet es unter demselben Problem wie unser Bildbeispiel. Wenn der Include-Code in ein anderes Verzeichnis verschoben wird, kann die Referenz fehlschlagen. Aber bei PHP funktioniert das einfache Verwenden des beginnenden „/“ nicht, was sehr verwirrend sein kann.

Das Problem ist, dass PHP ein wenig „tiefer“ in das Dateisystem Ihres Servers schauen kann als HTML. Zum Beispiel befindet sich das öffentliche Webverzeichnis von CSS-Tricks auf meinem Server tatsächlich unter „/var/www/vhosts/css-tricks.com/httpdocs“. Wenn Sie also einen Include mit einem „/“ am Anfang machen, schaut es WEIT tiefer, als Sie es beabsichtigen. Sie möchten eigentlich, dass es in diesem öffentlichen Webverzeichnis nachschaut. In meinem Fall „httpdocs“.

Um diese Funktionalität zurückzugewinnen und relative Dateipfade zu haben, die sich nicht ändern, verwenden Sie dieses kleine PHP-Schmankerl

<?php 
   $path = $_SERVER['DOCUMENT_ROOT'];
   $path .= "/common/header.php";
   include_once($path);
?>

Grundlagen für alle Programmierer, aber dieser hatte mich ewig im Griff.

Eine weitere Technik

Brian Vanderberg schreibt

Ich habe festgestellt, dass in einigen Umgebungen DOCUMENT_ROOT nicht richtig gesetzt zu sein scheint. Ich habe einen Weg entwickelt, der unabhängig vom Server ist und ob der Hosting-Anbieter die Möglichkeit bietet, einen Include- oder Auto-Prepend-Pfad festzulegen.

Jedes Verzeichnis enthält eine 'meta'-Datei namens '__php__.php' (oder wie auch immer man sie nennen möchte). Für alle Dateien in diesem Verzeichnis werden sie einfach wie folgt eingebunden: <?php include('__php__.php'); ?>. Die Datei selbst bindet einfach die im übergeordneten Verzeichnis liegende ein, bis hin zum Stammverzeichnis der Website. Die Datei im Stammverzeichnis kann dann andere Dateien einbinden, eine einfache Möglichkeit, Dateien automatisch einzubinden, auch wenn ein Dienstanbieter dies nicht unterstützt, und auch eine Variable wie 'SITE_ROOTDIR' definieren, die dann später verwendet werden kann. Wenn die Quelldateien in ein anderes Verzeichnis verschoben werden, binden sie immer noch die __php__.php-Datei in diesem Verzeichnis ein und erhalten die SITE_ROOTDIR-Konstante aus der oberen __php__.php-Datei.

Ich mache auch etwas Ähnliches für eine einfache Navigationsleiste, bei der jedes Verzeichnis eine __navbar__.php-Datei hat und jede Seite sie einfach an der richtigen Stelle einbindet und sie übergeordnete Navigationselemente einbinden und eigene Navigationselemente definieren kann.

Ein Vorteil davon ist, dass ein Teil der Website in einem Unterverzeichnis unterteilt werden kann und trotzdem den Root dieses Teils erhält, auch wenn es nicht der eigentliche Dokumenten-Root ist. Ein Nachteil ist, dass es bei stark frequentierten Websites zu Verlangsamungen beim Einbinden kommen kann.

Noch eine weitere

<?php set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); ?>