2013-07-01 16 views
41

Ich habe Datei /root/update/test.php. Es gibt auch eine Datei, /root/connect.php; Diese Datei hat eine ZeilePHP enthalten relativen Pfad

include "../config.php"; 

In /root/update/test.php. Es ist der Code

set_include_path(".:/root"); 
include "connect.php"; 

Als ich /root/update/test.php laufen, es connect.php findet, doch irgendwie config.php zu finden, mir geben

PHP Warning: include(../config.php): failed to open stream: No such file or directory in /root/connect.php on line 2 
PHP Warning: include(): Failed opening '../config.php' for inclusion (include_path='.:/root') 

Dies ist für mich verwirrend weil die Warnungen es scheinen, als ob ich alles richtig mache - der Include-Pfad ist/root und sucht nach der Datei ../config.php (/config.php), die existiert. Kann mir das jemand aufklären? Beachten Sie, dass die Verwendung absoluter Pfade für mich aufgrund der Bereitstellung auf einem Produktionsserver, auf den ich keinen Zugriff habe, keine Option darstellt.

Ubuntu/Apache

+0

Ich versuche, config.php relativ zu Ihrem CWD, das ist/root/update /, und sucht nach /root/config.php – user4035

+0

Dies ist: include "../config.php" bringt Sie in den Ordner, der ist Eltern zu Stammordner. Befindet sich config.php dort? – Gimmy

+0

Was ist der vollständige Pfad der config.php? – meiamsome

Antwort

83

Man könnte immer enthalten sie __DIR__ mit:

include(dirname(__DIR__).'/config.php'); 

__DIR__ 'magischen' ist und kehrt das Verzeichnis der aktuellen Datei ohne den Schrägstrich. Es ist eigentlich ein absoluter Pfad, Sie müssen nur den Dateinamen an __DIR__ verketten. In diesem Fall, da wir ein Verzeichnis aufsteigen müssen, verwenden wir PHP dirname, das den Dateibaum aufsteigt, und von hier aus können wir auf config.php zugreifen.

Sie könnten den Root-Pfad in diesem Verfahren festgelegt zu:

define('ROOT_PATH', dirname(__DIR__) . '/'); 

in test.php Ihre Wurzel am /root/ Ebene setzen würde.

Sollte dann arbeiten, um die Konfigurationsdatei von wo Sie wollen.

+3

Wenn Sie planen, diese Konstanten mit relativen Pfaden zu verwenden (dh '../'), Ich würde Sie ermutigen, es mit 'realpath()' vor dem 'define()' aufzuräumen. –

+1

Anstatt 'ROOT_PATH. '.. /'' zu verwenden, würde ich 'dirname (ROOT_PATH)' verwenden. Letzteres würde Ihnen einen "absoluteren" Weg geben. – Kayla

+0

Ich habe eine Fehlerbehandlungscheckliste für diesen häufigen Fehler hier gestartet: stackoverflow.com/a/36577021/2873507 –

1

Während ich schätzen Sie absolute Pfade glauben, ist keine Option, es ist eine bessere Option als relative Pfade und Aktualisierung der PHP Pfad enthalten.

Verwenden Sie absolute Pfade mit einer Konstante, die Sie basierend auf der Umgebung festlegen können.

if (is_production()) { 
    define('ROOT_PATH', '/some/production/path'); 
} 
else { 
    define('ROOT_PATH', '/root'); 
} 

include ROOT_PATH . '/connect.php'; 

Wie kommentierte ROOT_PATH auch aus dem aktuellen Pfad abgeleitet werden könnte, $_SERVER['DOCUMENT_ROOT'] usw.

+0

'define ('ROOT_PATH', __DIR __. '/ .. /'); ', vielleicht? – meiamsome

+1

Dies ist definitiv ein guter Vorschlag, und sicherlich funktioniert - aber __DIR__ ist mehr, was ich suche. (Ich bin nicht der Downvoter) –

+0

Ich habe eine Fehlersuche Checkliste für diesen häufigen Fehler hier gestartet: stackoverflow.com/a/36577021/2873507 –

0
function relativepath($to){ 
    $a=explode("/",$_SERVER["PHP_SELF"]); 
    $index= array_search("$to",$a); 
    $str=""; 
    for ($i = 0; $i < count($a)-$index-2; $i++) { 
     $str.= "../"; 
    } 
    return $str; 
    } 

Hier ist die beste Lösung, die ich darüber gemacht, man muss nur auf dem Niveau angeben Sie stoppen wollen, aber das Problem ist, dass Sie diese Ordnernamen einmal verwenden.

Verwandte Themen