Linuchs: Problem mit include_path

Moin,

in meinen bisherigen Projekten war der include_path vom Web erreichbar, nun habe ich ihn in eine höhere Ebene gesetzt. Im Filezilla sehe ich diese Struktur:

Ein Programm im Pfad 100 enthält die Zeile

ini_set( 'include_path', '/domains/example.org/include/' );

Statt example.org natürlich die Domain. Die Zeile

include( "db_connect.php" );

ergibt den Fehler include(/domains/example.org/include/db_connect.php): failed to open stream: No such file or directory

Die Zeile

include( "/domains/example.org/include/db_connect.php" );

ergibt denselben Fehler. db_connect.php ist im Pfad include enthalten. Vermute ich richtig, dass PHP den Dateibaum anders sieht als Filezilla?

Da ich die include-Dateien in verschiedenen Pfaden (nicht nur 100) aufrufen möchte, entfällt eine relative Adressierung, oder?

Gruß, Linuchs

akzeptierte Antworten

  1. Hi,

    Vermute ich richtig, dass PHP den Dateibaum anders sieht als Filezilla?

    Vermutlich.

    <?php echo $_SERVER["DOCUMENT_ROOT"] ?>
    

    Bei FTP wird Dir normalerweise nur der Pfad unterhalb "Deines" Bereichs angezeigt, nicht der tatsächliche Dateisystempfad. Also im Prinzip wie bei http ..

    cu,
    Andreas a/k/a MudGuard

    1. Hallo Andreas,

      danke für den Tipp. Mit

      ini_set( 'include_path', $_SERVER["DOCUMENT_ROOT"] . "/../include/" );
      

      fuktionierts.

    2. Hallo MudGuard,

      Bei FTP wird Dir normalerweise nur der Pfad unterhalb "Deines" Bereichs angezeigt

      Das hängt vom Hoster und von der FTP Verbindung ab. Bei meinem Hoster sehe ich bei einer FTP-Verbindung meinen Customer-Bereich als Root, und bei SFTP sehe ich den kompletten Pfad ab Root.

      $_SERVER['DOCUMENT_ROOT'] ist jedenfalls eine sinnvolle Möglichkeit.

      Eine andere Idee könnte sein, den Includepfad relativ zur magic constant __DIR__ zu setzen. Die ist aber schlechter, man sollte das nur tun wenn das Script von der Kommandozeile laufen soll (wo $_SERVER['DOCUMENT_ROOT'] leer ist), denn bei Verwendung von __DIR__ muss man jedesmal nachdenken, in welchem Ordner das Script ist, von dem aus eingebunden wird.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Tach!

        $_SERVER['DOCUMENT_ROOT'] ist jedenfalls eine sinnvolle Möglichkeit.

        Naja, sinnvoller wäre es, solche Dinge nicht im Script sondern in der Konfiguration festzulegen. Zum Beispiel in der .user.ini.

        [...] denn bei Verwendung von __DIR__ muss man jedesmal nachdenken, in welchem Ordner das Script ist, von dem aus eingebunden wird.

        Nein, denn __DIR__ liefert das Verzeichnis der Datei, in dem das __DIR__ steht, nicht das von der aufgerufenen und/oder inkludierenden Datei.

        dedlfix.

        1. Hallo dedlfix,

          __DIR__ liefert das Verzeichnis der Datei, in dem das __DIR__ steht, …

          ja, sicher.

          Wenn /usr/http das document root ist, dann kann ich in einer Datei /usr/http/foo/bar.php mit include __DIR__ . "/../baz/xyz.inc" die Datei /usr/http/baz/xyz.inc hereinholen. Oder den Include Path entsprechend ergänzen.

          Ich muss halt nur jedesmal, wenn ich das programmiere, darauf aufpassen, wieviele Stufen ich von der Datei, die __DIR__ enthält, hinaufgehen muss, um zum document root zu kommen. Und wenn ich mein Projekt umstrukturieren sollte, muss ich so richtig aufpassen, wo überall __DIR__ verwendet wird. Deswegen sagte ich, dass das die schlechtere Idee ist und nur dort relevant wird, wo $_SERVER nicht verfügbar ist.

          Eine .user.ini ins document root zu legen ist aber auf jeden Fall auch eine gute Alternative. Ich frag mich grad nur: Wenn in /usr/http/ eine php.user.ini steht, in der der include_path um ./baz erweitert wird, und ich rufe /usr/http/foo/bar.php auf - was ist dann .? Der Ort der .user.ini oder der Ort des PHP Scripts?

          … nicht das von der aufgerufenen und/oder inkludierenden Datei.

          Da verstehe ich deine Überlegungen nicht. Der Ansatz war doch, das __DIR__ in der Datei zu verwenden, wo auch das include steht. Also in der inkludierenden Datei. Das Verzeichnis der aufgerufenden Datei (meinst Du damit die inkludierte Datei?) muss ich ja relativ zum document root eh kennen.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Tach!

            • was ist dann .? Der Ort der .user.ini oder der Ort des PHP Scripts?

            Current Working Directory, so wie alle relativen Angaben.

            Da verstehe ich deine Überlegungen nicht. Der Ansatz war doch, das __DIR__ in der Datei zu verwenden, wo auch das include steht.

            Ich gehe davon aus, dass es nicht sonderlich sinnvoll ist, in jeder Startdatei erstmal ermitteln zu müssen, wo der Include-Pfad ist. Man setzt den ja zentral, damit man sich nicht darum kümmern muss. Wenn man das aus irgendeinem Grund nicht in der .user.ini (ohne php davor) oder anderenorts konfigurieren kann, sollte man das zumindest in einer zentralen PHP-Datei erledigen. Und den Pfad zu dieser kann man ja dann relativ angeben.

            dedlfix.