Wie binde ich PHP-Dateien ein, die einen absoluten Pfad erfordern?

StackOverflow https://stackoverflow.com/questions/4369

  •  08-06-2019
  •  | 
  •  

Frage

Ich habe eine Verzeichnisstruktur wie die folgende;

script.php

inc/include1.php
inc/include2.php

Objekte/Objekt1.php
Objekte/Objekt2.php

Soap/soap.php

Jetzt verwende ich diese Objekte in beiden script.php Und /soap/soap.php, ich könnte sie verschieben, aber ich möchte aus einem bestimmten Grund eine solche Verzeichnisstruktur haben.Bei der Ausführung script.php Der Include-Pfad lautet inc/include.php und bei der Ausführung /soap/soap.php es ist ../inc, absolute Pfade funktionieren, /mnt/webdev/[project name]/inc/include1.php... Aber es ist eine hässliche Lösung, wenn ich das Verzeichnis jemals an einen anderen Ort verschieben möchte.

Gibt es also eine Möglichkeit, relative Pfade zu verwenden oder diese programmgesteuert zu generieren? "/mnt/webdev/[project name]/"?

War es hilfreich?

Lösung

Das sollte funktionieren

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

Bearbeiten: zusätzliche Verbesserung durch aussieviking

Andere Tipps

Sie können relative Pfade verwenden.Versuchen __FILE__.Dies ist eine PHP-Konstante, die immer den Pfad/Dateinamen des Skripts zurückgibt, in dem sie sich befindet.Also rein soap.php, du könntest es tun:

include dirname(__FILE__).'/../inc/include.php';

Der vollständige Pfad und der Dateiname der Datei.Bei Verwendung in einem Einfügen wird der Name der mitgelieferten Datei zurückgegeben.Seit PHP 4.0.2, __FILE__ Enthält immer einen absoluten Pfad mit Symlinks aufgelöst, während sie in älteren Versionen unter bestimmten Umständen den relativen Weg enthielt. (Quelle)

Eine andere Lösung wäre, eine zu setzen Pfad einschließen in Ihrer httpd.conf oder einer .htaccess-Datei.

schau mal rein http://au.php.net/reserved.variables

Ich denke, die Variable, nach der Sie suchen, ist: $_SERVER["DOCUMENT_ROOT"]

Sie könnten eine Konstante mit dem Pfad zum Stammverzeichnis Ihres Projekts definieren und diese dann am Anfang des Pfads einfügen.

Eine andere Möglichkeit, dies zu handhaben, bei der überhaupt keine Includes erforderlich sind, ist die Verwendung von Autoload Besonderheit.Wenn Sie alles, was Ihr Skript benötigt, „nur für den Fall“ einbeziehen, kann dies die Leistung beeinträchtigen.Wenn es sich bei Ihren Includes ausschließlich um Klassen- oder Schnittstellendefinitionen handelt und Sie diese nur bei Bedarf laden möchten, können Sie die überladen __autoload() Funktion mit Ihrem eigenen Code, um die entsprechende Klassendatei zu finden und sie nur zu laden, wenn sie aufgerufen wird.Hier ist das Beispiel aus dem Handbuch:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

Solange Sie Ihre include_path-Variablen entsprechend festlegen, müssen Sie nie wieder eine Klassendatei einbinden.

Eine weitere Option, die mit der von Kevin verwandt ist, ist die Verwendung __FILE__, sondern ersetzen Sie stattdessen den darin enthaltenen PHP-Dateinamen:

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

Ich benutze das schon eine Weile.Das einzige Problem ist, dass man es manchmal nicht hat $_SERVER['SCRIPT_NAME'], aber manchmal gibt es eine andere Variable, die ähnlich ist.

Ich fand, dass das sehr gut funktioniert!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

Verwenden:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>

Ich denke, der beste Weg ist, Ihre Includes in Ihren PHP-Include-Pfad einzufügen.Abhängig von Ihrem Setup gibt es verschiedene Möglichkeiten, dies zu tun.

Dann können Sie einfach darauf verweisen

require_once 'inc1.php';

aus jeder Datei, unabhängig davon, wo sie sich befindet, ob in Ihren Includes oder in Ihren über das Internet zugänglichen Dateien oder auf einer beliebigen Ebene verschachtelter Unterverzeichnisse.

Dadurch können Sie Ihre Include-Dateien außerhalb des Webserver-Roots ablegen, was eine bewährte Methode ist.

z.B.

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

Schauen Sie sich auch __autoload für das verzögerte Laden von Klassendateien an

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

Ich verwende diese Codezeile.Es geht zurück zur „Oberseite“ des Site-Baums und dann zur gewünschten Datei.

Nehmen wir zum Beispiel an, ich habe diesen Dateibaum:

domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php

Ich kann die Datei „functions.php“ von jedem Ort aus einbinden, indem ich sie einfach durch Kopieren und Einfügen einfüge

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

Wenn Sie diesen Code mehrmals verwenden müssen, können Sie eine Funktion erstellen, die Folgendes zurückgibt str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)) Teil.Dann fügen Sie diese Funktion einfach in die erste Datei ein, die Sie einbinden.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 einbinden muss, verwende ich tatsächlich einfach die Funktion (named path_back):

require(path_back()."/_resources/another_php_file.php");

@Flubba, kann ich dadurch Ordner in meinem Include-Verzeichnis haben?Flat-Include-Verzeichnisse bereiten mir Albträume.da sich das gesamte Objektverzeichnis im Inc-Verzeichnis befinden sollte.

Oh ja, absolut.So verwenden wir beispielsweise eine einzelne Ebene von Unterordnern, im Allgemeinen:

require_once('library/string.class.php')

Sie müssen vorsichtig sein, wenn Sie sich auf sehr stark frequentierten Websites zu sehr auf den Include-Pfad verlassen, da PHP das aktuelle Verzeichnis und dann alle Verzeichnisse im Include-Pfad durchsuchen muss, um zu sehen, ob Ihre Datei dort ist, was zu einer Verlangsamung führen kann Dinge hoch, wenn du gehämmert wirst.

Wenn Sie beispielsweise MVC verwenden, geben Sie den Pfad zu Ihrem Anwendungsverzeichnis in den Include-Pfad ein und geben dann im Formular Verweise auf Dinge an

'model/user.class'
'controllers/front.php'

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 dieser ganze Dokument-Root-Malarkey mit echten Pfaden.

Der Vorteil dieser von anderen vorgeschlagenen skriptbasierten Alternativen besteht darin, dass sie überall funktionieren, sogar auf gemeinsam genutzten Boxen.Das Festlegen des Include-Pfads erfordert etwas mehr Überlegung und Aufwand, aber wie ich bereits erwähnt habe, können Sie mit der Verwendung von __autoload beginnen, was einfach das Coolste ist.

Wenn Sie in den meisten Dateien Ihrer Anwendung einen bestimmten Pfad angeben möchten, erstellen Sie eine globale Variable für Ihren Stammordner.

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

Nun diese globale Variable „ANWENDUNGSPFAD„ kann verwendet werden, um alle Dateien einzuschließen, anstatt jedes Mal, wenn Sie eine neue Datei einbinden, realpath() aufzurufen.

EX:

include(APPLICATION_PATH ."/config/config.ini";

Ich hoffe es hilft ;-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top