Bei "wget http://example.com/yourscript.php" statt "php /path/to/yourscript.php" läuft dein Script im Kontext deines Webservers und nur dann gibt es auch ein DocRoot.
belastet das den server nicht mehr als wenn ich direkt über php aufrufe? ich halte das für meine zwecke nicht für die lösung de sproblems, da ich noch andere komponenten habe die mit einspielen. ich suche eine lösugn für ein fehlendes DOCUMENT_ROOT
Das klingt nach PHP_SELF, bringt mir aber leider auch nichts.
DOCUMENT_ROOT gibt beispielsweise
/usr/www/httpdocs aus, so dass ich darauf meine include festlegen kann
z.b.
$_SERVER['DOCUMENT_ROOT']/ebene1/ebene2/class.php
wenn ich aber __FILE__ oder PHP_SELF verwende und mich einmal in ebene1 udn einmal in ebene2 befinde haben die variablen verschiedende werte und meine includes wären unterschiedlich und haken dann ...
Es gibt keine Alternative. DR wird vom Webserver nur deswegen reingereicht, damit man Links bauen kann. Viele Scripte nutzen es auch, um ihre Includes zu finden. Das ist aber Pfeffer.
Die Idee hinter
include $_SERVER['DOCUMENT_ROOT'].'/incs/functions.php';
ist, dass man nicht wissen muss, wo das Verzeichnis incs liegt. Aber es bringt eben die Einschränkung mit sich, dass incs nicht außerhalb des DR liegen kann.
tick tack tick tack
Doch, kann es!
include $_SERVER['DOCUMENT_ROOT'].'/../incs/functions.php';
Die Einschränkung ist also, dass der Programmierer die relative Position von incs kennen muss und zwar relativ zu irgendwas, was er wiederum nicht kennen muss.
Ganz toll, bringt aber nichts. Die gewonnene Flexibilität ist die, dass man den DR als Ganzes verschieben kann. Einzelne Dateien kann man allerdings nicht verschieben.
Die relative Position der Datein zueinander ist also fix, lediglich der Standort des alles umgebenden Verzeichnisses ist flexibel. Das wäre aber auch dann der Fall, wenn sich die Scripte relativ zueinander referenzieren, also mit
include '../incs/functions.php';
Wenn du das auch so machst, so relativ, dann brauchst du keine Variable für DR.
Original geschrieben von sEeb Das klingt nach PHP_SELF, bringt mir aber leider auch nichts.
DOCUMENT_ROOT gibt beispielsweise
/usr/www/httpdocs aus, so dass ich darauf meine include festlegen kann
z.b.
$_SERVER['DOCUMENT_ROOT']/ebene1/ebene2/class.php
wenn ich aber __FILE__ oder PHP_SELF verwende und mich einmal in ebene1 udn einmal in ebene2 befinde haben die variablen verschiedende werte und meine includes wären unterschiedlich und haken dann ...
Mach ein Config-File, in dem die Pfade gesetzt werden und du weißt, wo sich dieses Datei befinden. Wo ist also das Problem?
DOCUMENT_ROOT/ebene1/class.php einbinden.
diese beinhaltet ein include nach '../class2.php' als auf DOCUMENT_ROOT/class2.php
wenn ich nun aber von DOCUMENT_ROOT/ebene1/ebene2/class.php
aus versuche die datei einzubinden würde aus include '../class2.php' ein DOCUMENT_ROOT/ebene1/class2.php und das ganze schlägt fehl ...
das setzen eines config files bringt mir dabei auch nicht viel, denn wenn ich da in jeder datei den absoluten pfad angebe und ich die datei mal verschiebe warum auch immer, müssen dutzende dateien angepasst werden
Die .. beziehen sich nicht auf die Position des zuletzt inkludierten Files sondern aufs aktuelle Verzeichnis.
Beispiel:
/path/to/yourscript.php wechselt nach dirname(__FILE__) und inkludiert "../incs/foo/class1.php". Der ganze Pfad ist also /path/to/../incs/foo, effektiv ist das /path/incs/foo.
/path/incs/foo/class1.php inkludiert nun seinerseits "../class2.php".
Na, wo muß class2.php liegen?
Der ganze Pfad liest sich /path/to/../incs2, effektiv /path/incs2 und nicht, wie du anscheinend glaubst /path/incs/foo/../incs2! Der Grund ist klar: Die relativen Pfade beziehen sich auf das Arbeitsverzeichnis, nicht auf den Standort der Datei, in der sie benutzt werden. In Code ausgedrückt:
include '../class.php';
ist das selbe wie
include getcwd().'/../class.php';
aber nicht das selbe wie
include dirname(__FILE__).'/../class.php';
Zuletzt geändert von onemorenerd; 14.11.2008, 14:16.
1. Der Server ist komisch konfiguriert.
2. Eine vernünftige Lösung (autoload) willst/kannst du nicht.
3. Du hast vor ganze Programmverzeichnis herumzuschieben.
Das sind 3 Dinge, die alleine schon furchtbar sind, aber alles zusammen... Unter den Bedingungen würde _ich_ nicht programmieren wollen.
Kommentar