Wie füge ich PHP-Dateien hinzu, die einen absoluten Pfad benötigen?

  • Ich habe eine Verzeichnisstruktur wie folgt:

    script.php

    inc / include1.php
    inc / include2.php

    objects / object1.php
    objects / object2.php

    soap / soap.php

    Nun verwende ich diese Objekte in script.php und /soap/soap.php, ich könnte sie verschieben, aber ich möchte aus einem bestimmten Grund eine solche Verzeichnisstruktur. Bei der Ausführung von script.php ist der Include-Pfad inc/include.php, und bei der Ausführung von /soap/soap.php ist es ../inc, absolute Pfade funktionieren, /mnt/webdev/[project name]/inc/include1.php.... p>

    Gibt es eine Möglichkeit, relative Pfade zu verwenden, oder eine Methode zur programmierbaren Generierung von "/mnt/webdev/[project name]/"?

    30 June 2016
    Jasper
10 answers
  • Sie können relative Pfade verwenden. Versuchen Sie es mit __FILE__. Dies ist eine PHP-Konstante, die immer den Pfad / Dateinamen des Skripts zurückgibt, in dem es sich befindet. In soap.php können Sie Folgendes tun:

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

    Der vollständige Pfad und Dateiname der -Datei. Bei Verwendung in einem Include wird der Name der eingeschlossenen Datei zurückgegeben. Seit PHP 4.0.2 enthält __FILE__ immer einen absoluten Pfad mit Symlinks, die in älteren aufgelöst wurden Versionen enthalten relativen Pfad unter bestimmten Umständen. (source)

    Eine andere Lösung wäre, einen include-Pfad in Ihrer httpd.conf oder einer .htaccess-Datei festzulegen.

    09 September 2017
    Ivan Akulov
  • werfen Sie einen Blick auf http://au.php.net/reserved.variables

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

    13 July 2011
    Andy
  • Sie können eine Konstante mit dem Pfad zum Stammverzeichnis Ihres Projekts definieren und diese an den Anfang des Pfads setzen.

    07 August 2008
    Ryan FoxCade
  • Eine andere Möglichkeit, dies zu erreichen, ohne dass Include-Einstellungen überhaupt erforderlich sind, ist die Verwendung der autoload -Funktion. Wenn Sie alles einschließen, was Ihr Skript "Just in Case" benötigt, kann dies 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 Funktion __autoload() 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:

     function __autoload($class_name) {
        require_once $class_name . '.php';
    }
    
    $obj  = new MyClass1();
    $obj2 = new MyClass2(); 
     

    Solange Sie Ihre include_path-Variablen entsprechend einstellen, brauchen Sie dies nie um eine Klassendatei wieder aufzunehmen.

    18 September 2008
    Sam McAfee
  • Eine weitere Option, die sich auf Kevins bezieht, ist die Verwendung von __FILE__. Ersetzen Sie stattdessen den PHP-Dateinamen darin:

     <?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 Sie manchmal $_SERVER['SCRIPT_NAME'] nicht haben, aber manchmal gibt es eine andere ähnliche Variable.

    27 November 2013
    HamZa
  • Ich fand, dass dies sehr gut funktioniert!

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

    Verwendung:

     <?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');
    
    ?>
     
    04 March 2017
    Nisse EngströmKebron
  •  require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");
     

    Ich verwende diese Codezeile. Es geht zurück zum "Anfang" des Site-Baums und geht dann zur gewünschten Datei.

    Nehmen wir 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 functions.php-Datei von jedem beliebigen Ort aus einschließen durch Einfügen von Kopien

     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 den Code 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 enthalten. Ich habe eine "initialize.php" -Datei, die ich ganz oben auf jeder PHP-Seite einfüge und diese Funktion enthält. Das nächste Mal, wenn Dateien eingefügt werden müssen, verwende ich einfach die Funktion (mit dem Namen path_back):

     require(path_back()."/_resources/another_php_file.php");
     
    13 April 2015
    MachavityMatthias Scholz
  • Ich denke, der beste Weg ist es, Ihre Include-Dateien in Ihren PHP-Include-Pfad einzufügen. Es gibt verschiedene Möglichkeiten, dies abhängig von Ihrem Setup zu tun.

    Dann können Sie sich einfach auf

     require_once 'inc1.php';
     

    beziehen eine beliebige Datei, unabhängig davon, ob sie sich in Ihren Include-Dateien oder in Ihren im Web zugänglichen Dateien befindet, oder auf einer Ebene verschachtelter Unterverzeichnisse.

    Dies ermöglicht Ihnen, Ihre Include-Dateien außerhalb des Webservers zu haben root ist eine bewährte Methode.

    z

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

    Überprüfen Sie auch __autoload für das langsame Laden von Klassendateien

    http://www.google.com/search?q = Einstellung + php + include + Pfad

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

    07 August 2008
    Polsonby
  • 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'));
     

    Jetzt kann diese globale Variable " APPLICATION_PATH " verwendet werden, um alle Dateien einzuschließen, anstatt realpath () aufzurufen, wenn Sie eine neue Datei einschließen

    EX:

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

    Hoffe, es hilft; -)

    09 May 2018
    yuvraj
  • @Flubba, kann ich Ordner innerhalb meines Include-Verzeichnisses haben? Wohnung enthalten Verzeichnisse geben mir Albträume. Das gesamte Objektverzeichnis sollte sich im Verzeichnis inc befinden.

    Oh ja, absolut. So verwenden wir zum Beispiel eine einzige Ebene von Unterordnern, im Allgemeinen:

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

    Sie müssen vorsichtig sein, wenn Sie sich darauf verlassen auf dem Include-Pfad zu viel in wirklich verkehrsreichen Websites, da PHP das aktuelle Verzeichnis und dann alle Verzeichnisse im Include-Pfad durchsuchen muss, um zu sehen, ob Ihre Datei vorhanden ist und dies die Dinge verlangsamen kann, wenn Sie es bekommen gehämmert

    Wenn Sie beispielsweise MVC ausführen, geben Sie den Pfad zu Ihrer Anwendungsverfügung in den Include-Pfad ein und geben Sie dann die Verweise auf Dinge in der Form

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

    oder was auch immer.

    Aber im Allgemeinen können Sie damit arbeiten mit wirklich kurzen Pfaden in Ihrem PHP, die von überall aus funktionieren und es viel einfacher zu lesen ist als all diese Realpath-Dokumentwurzel Malarkey.

    Der Vorteil dieser skriptbasierten Alternativen, die von anderen vorgeschlagen wurden, ist, dass sie überall funktionieren, sogar in gemeinsam genutzten Boxen. Das Einrichten des Include-Pfads erfordert etwas mehr Überlegung und Mühe, aber wie bereits erwähnt, können Sie mit __autoload beginnen, was gerade der coolste ist.

    09 August 2008
    Polsonby