Ich habe eine Verzeichnisstruktur wie die folgende;
script.php
inc / include1.php
inc / include2.phpobjectes / object1.php
Objekte / object2.phpsoap / soap.php
Jetzt verwende ich diese Objekte in beiden script.php
und /soap/soap.php
ich könnte sie verschieben, aber ich möchte die Verzeichnisstruktur aus einem bestimmten Grund so. Bei der Ausführung ist script.php
der Include-Pfad inc/include.php
und bei der Ausführung ist /soap/soap.php
es../inc
, funktionieren absolute Pfade. /mnt/webdev/[project name]/inc/include1.php...
Es ist jedoch eine hässliche Lösung, wenn ich das Verzeichnis jemals an einen anderen Speicherort verschieben möchte.
Gibt es also eine Möglichkeit, relative Pfade zu verwenden oder die programmgesteuert zu generieren "/mnt/webdev/[project name]/"
?
DOCUMENT_ROOT
Sie können relative Pfade verwenden. Versuchen Sie es
__FILE__
. Dies ist eine PHP-Konstante, die immer den Pfad / Dateinamen des Skripts zurückgibt, in dem sie sich befindet.soap.php
Sie können also Folgendes tun:Eine andere Lösung wäre, einen Include-Pfad in Ihrer httpd.conf oder einer .htaccess-Datei festzulegen.
quelle
/
am Anfang des zitierten Ausdrucks ein hinzufügen , um den Namen..
von der DATEI zu trennen .__DIR__
anstatt sie verwenden zu müssendirname(__FILE__)
. (PHP docs)include dirname(__FILE__).'/../inc/include.php';
Vergessen Sie nicht das "/" vor dem relativen Pfad.Eine andere Möglichkeit, dies zu handhaben, ohne dass Includes erforderlich sind, ist die Verwendung der Autoload- Funktion. Wenn Sie alles einschließen, was Ihr Skript benötigt, kann "Just in Case" die Leistung beeinträchtigen. Wenn Ihre Includes alle Klassen- oder Schnittstellendefinitionen sind und Sie sie nur bei Bedarf laden möchten, können Sie die
__autoload()
Funktion mit Ihrem eigenen Code überladen , um die entsprechende Klassendatei zu finden und sie nur beim Aufruf zu laden. Hier ist das Beispiel aus dem Handbuch:Solange Sie Ihre include_path-Variablen entsprechend festlegen, müssen Sie nie wieder eine Klassendatei einfügen.
quelle
Schauen Sie sich http://au.php.net/reserved.variables an
Ich denke, die Variable, nach der Sie suchen, ist:
$_SERVER["DOCUMENT_ROOT"]
quelle
Sie können eine Konstante mit dem Pfad zum Stammverzeichnis Ihres Projekts definieren und diese dann an den Anfang des Pfads setzen.
quelle
Eine andere Option, die sich auf Kevins bezieht, ist die Verwendung
__FILE__
, aber ersetzen Sie stattdessen den Namen der PHP-Datei darin:Ich benutze das schon eine Weile. Das einzige Problem ist, dass Sie manchmal keine haben
$_SERVER['SCRIPT_NAME']
, aber manchmal gibt es eine andere ähnliche Variable.quelle
Ich fand das sehr gut!
Verwenden:
quelle
Ich denke, der beste Weg ist, Ihre Includes in Ihren PHP-Include-Pfad aufzunehmen. Abhängig von Ihrem Setup gibt es verschiedene Möglichkeiten, dies zu tun.
Dann können Sie einfach darauf verweisen
aus jeder Datei heraus, unabhängig davon, wo sie sich in Ihren Includes oder in Ihren über das Internet zugänglichen Dateien oder auf einer beliebigen Ebene verschachtelter Unterverzeichnisse befindet.
Auf diese Weise können Sie Ihre Include-Dateien außerhalb des Webserver-Stammverzeichnisses haben. Dies ist eine bewährte Methode.
z.B
Überprüfen Sie auch __autoload auf das verzögerte Laden von Klassendateien
http://www.google.com/search?q=setting+php+include+path
http://www.google.com/search?q=__autoload
quelle
Ich benutze diese Codezeile. Es geht zurück zum "Anfang" des Site-Baums und dann zur gewünschten Datei.
Nehmen wir zum Beispiel an, ich habe diesen Dateibaum:
Ich kann die Datei functions.php von jedem Ort aus einfügen, indem ich sie einfach einfüge
Wenn Sie diesen Code mehrmals verwenden müssen, können Sie eine Funktion erstellen, die das
str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))
Teil zurückgibt . Fügen Sie diese Funktion dann einfach in die erste Datei ein, die Sie einschließen. Ich habe eine "initialize.php" -Datei, die ich ganz oben auf jeder PHP-Seite einfüge und die diese Funktion enthält. Wenn ich das nächste Mal Dateien einschließen muss, benutze ich tatsächlich nur die Funktion (benannt)path_back
):quelle
Oh ja, absolut. So verwenden wir beispielsweise im Allgemeinen eine einzelne Ebene von Unterordnern:
Sie müssen vorsichtig sein, wenn Sie sich bei Websites mit sehr hohem Datenverkehr zu sehr auf den Include-Pfad verlassen, da PHP das aktuelle Verzeichnis und dann alle Verzeichnisse im Include-Pfad durchsuchen muss, um festzustellen, ob Ihre Datei vorhanden ist, und dies kann sich verlangsamen Dinge auf, wenn Sie gehämmert werden.
Wenn Sie beispielsweise MVC ausführen, geben Sie den Pfad zu Ihrer Anwendungsdirektion in den Include-Pfad ein und geben dann an, auf welche Elemente im Formular verwiesen wird
oder Wasauchimmer.
Aber im Allgemeinen können Sie damit nur mit wirklich kurzen Pfaden in Ihrem PHP arbeiten, die von überall aus funktionieren, und es ist viel einfacher zu lesen als all diese Realpath-Dokument-Root-Malarkey.
Der Vorteil dieser skriptbasierten Alternativen, die andere vorgeschlagen haben, besteht darin, dass sie überall funktionieren, auch auf gemeinsam genutzten Boxen. Das Festlegen des Include-Pfads erfordert etwas mehr Gedanken und Mühe, aber wie bereits erwähnt, können Sie __autoload verwenden, das einfach das coolste ist.
quelle
Wenn Sie in den meisten Dateien Ihrer Anwendung einen bestimmten Pfad einfügen möchten, erstellen Sie eine globale Variable in Ihrem Stammordner.
Nun diese globale Variable " APPLICATION_PATH " verwendet werden, um alle Dateien einzuschließen, anstatt jedes Mal, wenn Sie eine neue Datei einfügen, realpath () aufzurufen.
EX:
Ich hoffe es hilft ;-)
quelle