Uzyskaj ścieżkę katalogu głównego projektu PHP


115

Mam taką strukturę folderów w moim projekcie PHP. (to jest pokazane w zaćmieniach)

-MySystem
    +Code
    +Data_Access
    -Public_HTML
        +css
        +js
        +Templates
    -resources

Kiedy próbuję tego kodu

echo $_SERVER['DOCUMENT_ROOT']

wyjście jest

D: / obszar roboczy

Jak mogę uzyskać ścieżkę do RootDirectory systemu ( MySystem) bez zakodowania na stałe nazwy folderu?

Odpowiedzi:


146

W przypadku PHP> = 5.3.0 spróbuj

Magiczne stałe PHP .

__DIR__

I uczyń swoją ścieżkę względną.

W przypadku PHP <5.3.0 spróbuj

dirname(__FILE__)

3
to jest po prostu niesamowite, próbowałem $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'] itd., ale to zadziałało doskonale!
webblover

78
To zależy od tego, gdzie używasz __DIR__ . Jest względny w stosunku do samego pliku, więc jeśli w dołączeniu, w podkatalogu, nie zwróci tylko katalogu głównego.
Iris

10
Nie da to katalogu głównego
inrsaurabh

1
krótka notatka dla każdego, kto natknie się na tę odpowiedź, szukając odpowiedzi na zadane pytanie, DIR pobiera katalog bieżącego pliku, a nie katalog główny projektu, chyba że wywołasz go w pliku, który jest w katalogu głównym projektu, ale ponieważ php nie mieć koncepcję projektu, wszystkie ścieżki muszą być bezwzględne lub względne w stosunku do bieżącej lokalizacji
MikeT

Nie głosuj za odpowiedzią, która nie odpowiada poprawnie na pytanie, tylko dlatego, że ci pomogła.
ElYeante

73

Kiedy to mówisz

$_SERVER['DOCUMENT_ROOT']

zawiera tę ścieżkę:

D:/workspace

W takim razie D:tego szukasz, prawda? W takim przypadku możesz zdetonować łańcuch ukośnikami i zwrócić pierwszy:

$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];

Spowoduje to wyświetlenie katalogu głównego serwera.

Aktualizacja: Gdy używasz stałej DIRECTORY_SEPARATORzamiast zakodowanego na stałe ukośnika ( '/'), ten kod działa również w systemie Windows.

Aktualizacja 2:$_SERVER zmienna globalna nie zawsze jest dostępny. Na przykład w wierszu poleceń (cli). Więc powinieneś użyć __DIR__zamiast $_SERVER['DOCUMENT_ROOT']. __DIR__zwraca ścieżkę do samego pliku php.


2
Możesz użyć __DIR__zamiast $_SERVER['DOCUMENT_ROOT'].
Armin

Przepraszam Jeśli nie wyjaśniłem poprawnie mojego pytania, to, czego właściwie potrzebuję, to „D: / workspace / MySystem”
Nalaka526

1
jeśli ścieżka do katalogu głównego ma postać / var / public / www ”, to przy użyciu tej metody pierwszy ciąg w tablicy będzie pusty (0) / (1) / (2) / (3). drugi ciąg $ pathInPieces [1]
tbradley22


9

Chcę wskazać, jak Wordpress radzi sobie z tym:

define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );

Ponieważ Wordpress jest bardzo intensywnie używany w całym Internecie, a także działa dobrze lokalnie, mam duże zaufanie do tej metody.


1
Myślę, że działa to tylko wtedy, gdy masz dwa poziomy katalogów. Dobrze? Mam na myśli, że kiedy wywołujesz go z base_project_directory / folder1 / folder2 / folder3 / file.php, nie zwraca base_project_directory.
Ali Khalili

„Ponieważ Wordpress jest bardzo często używany w całej sieci, a także działa dobrze lokalnie, mam duże zaufanie do tej metody”. Nie sądzę, aby to był szczególnie dobry argument, biorąc pod uwagę jakość kodu WP i osiągnięcia w zakresie bezpieczeństwa.
Alex Barker

1
@AlexBarker Zakwestionowałbym fakt, że sugerujesz, że WP ma złe wyniki w zakresie bezpieczeństwa. W rzeczywistości jest całkiem bezpieczny i ma odpowiedzialny zespół skupiony na bezpieczeństwie - w ostatnich latach core miał bardzo niewiele problemów związanych z bezpieczeństwem (w tym od czasu, gdy komentowałeś).
William Patton

3

możesz spróbować: $_SERVER['PATH_TRANSLATED']

zacytować:

Ścieżka oparta na systemie plików (nie w katalogu głównym dokumentu) do bieżącego skryptu, po wykonaniu przez serwer jakiegokolwiek odwzorowania wirtualnego na rzeczywisty. Uwaga: Od PHP 4.3.2, PATH_TRANSLATEDnie jest już ustawiany niejawnie w Apache 2 SAPI, w przeciwieństwie do sytuacji w Apache 1, gdzie jest ustawiony na taką samą wartość jak SCRIPT_FILENAMEzmienna serwera, gdy nie jest zapełniana przez Apache.
Ta zmiana została wprowadzona w celu zapewnienia zgodności ze specyfikacją CGI, zgodnie z którą PATH_TRANSLATED powinna istnieć tylko wtedy, gdy PATH_INFOjest zdefiniowana. Użytkownicy Apache 2 mogą używać AcceptPathInfo = Onwewnątrz httpd.confdo definiowaniaPATH_INFO

źródło: php.net/manual


1
echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;

0

Podsumowanie

Ten przykład zakłada, że ​​zawsze wiesz, gdzie folder główny Apache to „/ var / www /” i próbujesz znaleźć następną ścieżkę do folderu (np. „/ Var / www / my_website_folder”). Działa to również ze skryptu lub przeglądarki internetowej, dlatego istnieje dodatkowy kod.

Kod PHP7

function getHtmlRootFolder(string $root = '/var/www/') {

    // -- try to use DOCUMENT_ROOT first --
    $ret = str_replace(' ', '', $_SERVER['DOCUMENT_ROOT']);
    $ret = rtrim($ret, '/') . '/';

    // -- if doesn't contain root path, find using this file's loc. path --
    if (!preg_match("#".$root."#", $ret)) {
      $root = rtrim($root, '/') . '/';
      $root_arr = explode("/", $root);
      $pwd_arr = explode("/", getcwd());
      $ret = $root . $pwd_arr[count($root_arr) - 1];
    }

    return (preg_match("#".$root."#", $ret)) ? rtrim($ret, '/') . '/' : null;
}

Przykład

echo getHtmlRootFolder();

Wynik:

/var/www/somedir/

Detale:

Zasadniczo najpierw próbuje pobrać DOCUMENT_ROOT, jeśli zawiera '/ var / www /', a następnie go użyć, w przeciwnym razie pobierz bieżący katalog (który istnieje w projekcie) i pobiera następną wartość ścieżki w oparciu o liczbę ścieżek $ root. Uwaga: dodano instrukcje rtrim, aby upewnić się, że ścieżka wraca zakończona znakiem „/” we wszystkich przypadkach. Nie sprawdza, czy musi być większy niż / var / www /, może również zwrócić / var / www / jako możliwą odpowiedź.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.