Relative und absolute Pfade im Dateisystem und auf dem Webserver.

Intro

Ihre Site existiert in zwei Bereichen gleichzeitig: dem realen und dem virtuellen.

Für die Site-Besucher ist es ein virtueller Server, der sich in vielerlei Hinsicht von einem realen Server unterscheidet. Es gibt keine Dateien für den Starter . Ich weiß, es ist zunächst schwer zu glauben, aber es ist eine Tatsache. Bei der Adresse wie http://example.com/file.html, file.htmlhandelt es sich nicht um eine Datei. Es ist ein Teil von URI, einer virtuellen Ressource. Es könnte eine echte Datei mit einem solchen Namen geben oder nicht, aber das spielt keine Rolle. Ihr Browser kann das nicht wissen und muss es auch nicht. Alles, was es wissen muss, ist eine Adresse.

Für den Site-Entwickler hingegen ist die Site ein bestimmtes Programm, das auf einem bestimmten Server auf einem sehr realen Computer mit Festplatte, Dateien und Verzeichnissen ausgeführt wird. Und Ihr PHP-Skript arbeitet beim Lesen von Datendateien oder beim Einbeziehen anderer Skripts mit solchen realen Dateien, die auf dem physischen Medium vorhanden sind .

Dieser Dualismus ist also die Wurzel vieler Probleme.

PHP-Benutzer verwirren diese Dinge zunächst sehr, indem sie beispielsweise eine vorhandene Datei nicht finden können, Hyperlinks mit Dateien verwechseln, einschließlich lokaler Dateien über HTTP und dergleichen.

Um diese Dinge zu klären, müssen Sie jedoch nur zwei einfache Konzepte erfassen:

  1. Der Unterschied zwischen absoluten und relativen Pfaden.
  2. Der Unterschied zwischen dem Stammverzeichnis des Webservers und dem Stammverzeichnis des Dateisystems .

Der Unterschied zwischen absoluten und relativen Pfaden

Es ist ziemlich einfach.

Es ist genau das gleiche wie bei den Anweisungen aus dem wirklichen Leben. Angesichts der absoluten Adresse, einer postalischen Adresse wie "7119 W Sunset Boulevard West Hollywood, CA 90046", können Sie den Standort von überall aus finden. Wenn Sie jedoch die relativen Richtungen wie "Halten Sie drei Blöcke auf diese Weise und biegen Sie dann nach rechts ab" angeben, funktioniert dies nur von der aktuellen Position aus. Andernfalls werden Sie in die Irre geführt.

Das gilt auch für die Wege in der Computerwelt: Mit der absoluten Adresse kommen Sie immer an den Ort, egal von wo Sie angefangen haben. Während der relative Pfad schwierig ist und nur dann mit Vorsicht verwendet werden sollte, wenn Sie genau wissen, wo Sie sich gerade befinden.

Absolute Pfade

Also nochmal: Ein absoluter Pfad ist einer, der von der Systemwurzel ausgeht

Einige absolute Pfadbeispiele:

/var/www/site/forum/index.php
/img/frame.gif
C:\windows\command.com

Beachten Sie, dass in Unix-ähnlichen Systemen (und Webservern) der Stamm als Schrägstrich - definiert ist /. Und das ist sehr wichtig zu wissen. Es ist nicht nur ein Marker, sondern bereits eine vollqualifizierte Adresse, ein Pfad. Geben Sie cd /in Ihrem Unix - Konsole und Sie werden in das Stammverzeichnis erhalten. Genau das gleiche gilt für alle Webserver. Sie können also feststellen, dass http://example.com/der abschließende Schrägstrich in der Adresse nicht für die Dekoration, sondern für eine reguläre Adresse selbst steht - die Adresse der Homepage.

Unter Windows hat das Dateisystem nicht das gemeinsame Stammverzeichnis für das gesamte System, sondern ist auf mehrere Festplatten aufgeteilt. Daher beginnt ein absoluter Pfad mit dem Laufwerksbuchstaben. Während jede Scheibe hat seine eigene Wurzel, die eine ist zurück Strich - \. So können Sie eingeben cd \und zum Stammverzeichnis der aktuellen Festplatte gelangen.

Sie können also feststellen, dass Windows ziemlich verwirrend ist, aber der Einfachheit halber würden wir so tun, als hätten wir nur eine Festplatte, und innerhalb seiner Grenzen sind die Regeln so ziemlich dieselben wie in Unix.

Jetzt können Sie also einen absoluten Pfad von einem relativen Pfad unterscheiden - er beginnt mit der Wurzel.

Relative Pfade

Wenn Sie die Wurzel nicht angeben, bedeutet dies, dass Ihr Pfad relativ ist.

Das einfachste Beispiel für einen relativen Pfad ist lediglich ein Dateiname index.html. Man sollte also vorsichtig mit relativen Pfaden sein. Wenn Ihr aktuelles Verzeichnis /about/dann index.htmleins ist, aber wenn Sie es wechseln, /contacts/wird es ein anderes sein.

Andere Beispiele für relative Pfade:

Was Sie wissen sollten, ist, dass das System, wenn es auf einen relativen Pfad stößt, diesen immer auf den absoluten Pfad aufbaut . Sowohl der Webserver als auch das Dateisystem tun dies auf unterschiedliche Weise. Also, lasst sie uns lernen.

Dokument Root

Dies ist der interessanteste Teil. Es gibt einen Punkt, an dem die reale Welt auf die virtuelle trifft.

Stellen Sie sich vor, es gibt eine Datei wie /var/www/site/forum/index.php. Auf dem Webserver lautet seine Adressehttp://www.site.ru/forum/index.php

Und hier ist der Punkt deutlich zu sehen: Es gibt einen Teil, der für beide Adressen gleich ist: /forum/index.phpder die eigentliche Quelle der Verwirrung ist.

Für den Browser ist dieser Pfad absolut, beginnend mit dem Stammverzeichnis des Webservers.
Während es für das Skript nur ein Teil des vollständigen Pfads ist - des Dateisystempfads. Und wenn Sie versuchen, es in PHP zu verwenden, führt dies zu einem Fehler: /forum/Auf der Festplatte befindet sich kein Katalog !

Um den Arbeitspfad zu dieser Datei zu erhalten, müssen wir das fehlende Teil hinzufügen. In unserem Beispiel /var/www/siteheißt es DOCUMENT_ROOTund ist die wichtigste Konfigurationsoption für die Dateisysteminteraktionen. In PHP können Sie über zugreifen $_SERVER['DOCUMENT_ROOT'].

Jetzt können Sie also feststellen, dass ein Dateisystempfad absolut und mithilfe von erstellt werden sollte, damit er funktioniert DOCUMENT_ROOT. Ein richtiger PHP-Code für den Zugriff /forum/index.phpvon PHP aus wäre also

$path = $_SERVER['DOCUMENT_ROOT'] . "/forum/index.php";

Hier verwenden wir den Webserver-Teil des Pfads und stellen ihm den Dokumentenstamm voran. Voila!

Webserver-Pfade

sind viel einfacher.

Wie gesagt, für den Browser befinden sich keine Dateien auf dem Server. Ein Site-Benutzer hat niemals Zugriff auf das Dateisystem des Servers. Für den Browser gibt es nur ein Site-Stammverzeichnis . Das ist konstant und immer einfach ein Schrägstrich .

Wenn Sie einen HTML-Link absolut machen möchten, erstellen Sie ihn einfach über das Stammverzeichnis der Website - und es wird nie wieder ein 404-Fehler für die vorhandene Datei angezeigt!

Stellen Sie sich vor, Ihre Site besteht aus zwei Abschnitten:

http://www.example.com/about/info.php
and
http://www.example.com/job/vacancy.php

und in dem info.phpdu verlinken willst vacancy.php. Wenn Sie es so machen, wie es ist, <a href=vacancy.php>wird es vom Browser nicht gefunden! Denken Sie daran, es wird immer versucht, den Link zum vollständigen /about/Pfad aufzubauen, und zwar unter Verwendung des aktuellen Standorts. Der resultierende Pfad ist /about/vacancy.phpalso falsch. Um es richtig zu machen, müssen wir diesen Link absolut machen, beginnend mit dem Site-Stammverzeichnis:/job/vacancy.php

Das gilt auch für alle internen Links auf der Website - Bilder, JS- und CSS-Dateien, Hyperlinks oder andere Ressourcen, die auf der Seite angeklickt oder geladen werden können.

Für die lokalen Ressourcen ist es besser, nur den Pfad ohne Protokoll und Domäne festzulegen /job/vacancy.php. Während für die externen Ressourcen diese Attribute obligatorisch sind, sollte es sich um eine vollqualifizierte URL handeln http://www.example.com/job/vacancy.php.

Konsolenskripte. Ein Einstiegspunkt

Schade, aber für die Konsolenskripte ist unsere nützliche $_SERVER['DOCUMENT_ROOT']Variable nicht verfügbar. Daher müssen wir Pfade relativ zum aufrufenden Skript verwenden, die vom aktuellen Speicherort des Skripts abgeleitet sind.

Zum Beispiel, wenn Ihre Anwendung gehostet in /var/www/appund es gibt zwei Unterordner, /var/www/app/binund /var/www/app/config, und Sie möchten die letztere aus der ehemaligen zuzugreifen, können Sie den folgenden Code schreiben:

$config_path = __DIR__.'/../config/settings.php';
require $config_path;

Obwohl technisch absolut (beginnend mit einem Schrägstrich), ist dieser Pfad im Wesentlichen relativ zum aufrufenden Skript, da die Konfigurationsdatei nicht mehr gefunden wird, wenn das aufrufende Skript in ein anderes Verzeichnis verschoben wird.

Aus diesem Grund wird empfohlen, für Ihre Anwendung einen einzigen Einstiegspunkt zu verwenden. Oder - wie in unserem Fall - zwei Einstiegspunkte, einen für Webanforderungen und einen für Konsolenbefehle.

Für unsere fiktive Anwendung hätten wir also drei Dateien - einen Einstiegspunkt für die Webfront, einen Einstiegspunkt für Konsolenanwendungen und eine Bootstrap-Datei:

Dann könnten wir (unter anderem) folgenden Code schreiben bootstrap.php:

define('ROOT_DIR', realpath(__DIR__.'/..'));

um die ROOT_DIRKonstante zu definieren , die den Pfad zum Stammverzeichnis unserer Anwendung enthält (das sich direkt über dem Verzeichnis befindet config).

Und dann in beiden index.phpund in console.phpder

require __DIR__.'/../config/bootstrap.php';

um alle Bootstrap-Dinge verfügbar zu machen, einschließlich der ROOT_DIR-Konstante. Von nun an können wir damit absolute Pfade vom Stammverzeichnis aus erstellen (sofern unsere Skripte über den Einstiegspunkt, entweder über das Web oder über die Konsole, aufgerufen werden):

include ROOT_DIR.'/config/settings.php';

Beispielimplementierungen finden Sie in Laravel's Artisan oder Symfony Console.

Natürlich sollten beide Einstiegspunkte eine Art Resolver implementieren, um alle anderen Seiten und Konsolenskripte aufzurufen, aber das liegt etwas außerhalb des Umfangs dieses Artikels.

Hilfreiche PHP-Befehle und Konstanten

Es gibt möglicherweise hilfreiche Befehle und Konstanten in PHP, um die Pfadinterpolation zu vereinfachen. Einige von ihnen sind:



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