Problem mit include_path
Linuchs
- php
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
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
Hallo Andreas,
danke für den Tipp. Mit
ini_set( 'include_path', $_SERVER["DOCUMENT_ROOT"] . "/../include/" );
fuktionierts.
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
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.
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
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 dasinclude
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.