Ottieni il percorso della directory principale di un progetto PHP


115

Ho questa struttura di cartelle nel mio progetto PHP. (questo è come mostrato nelle eclissi)

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

Quando provo questo codice

echo $_SERVER['DOCUMENT_ROOT']

l'output è

D: / spazio di lavoro

Come posso ottenere il percorso per RootDirectory del sistema ( MySystem), senza hardcoded il nome della cartella?

Risposte:


146

Per PHP> = 5.3.0 prova

Costanti magiche PHP .

__DIR__

E rendi relativo il tuo percorso.

Per PHP <5.3.0 prova

dirname(__FILE__)

3
questo è semplicemente fantastico, ho provato $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'] ecc. ma ha funzionato in modo eccellente!
webblover

78
Dipende da dove usi __DIR__ . È relativo al file stesso, quindi se in un include, all'interno di una sottodirectory, non restituirà solo la directory principale.
Iris

10
Non fornirà la directory principale
inrsaurabh

1
nota rapida per chiunque si imbatta in questa risposta cercando la risposta alla domanda posta, DIR ottiene la directory del file corrente non la radice del progetto a meno che non la chiami in un file che si trova nella radice del progetto, ma come php no avere il concetto di un progetto tutti i percorsi devono essere assoluti o relativi alla posizione corrente
MikeT

Per favore non votare una risposta che non affronta correttamente la domanda, solo perché ti ha aiutato.
ElYeante

73

Quando lo dici

$_SERVER['DOCUMENT_ROOT']

contiene questo percorso:

D:/workspace

Allora D:è quello che stai cercando, non è vero? In tal caso potresti far esplodere la stringa con barre e restituire il primo:

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

Questo produrrà la directory principale del server.

Aggiornamento: quando si utilizza la costante DIRECTORY_SEPARATORinvece della barra codificata ( '/'), questo codice funziona anche in Windows.

Aggiornamento 2: La $_SERVERvariabile globale non è sempre disponibile. Ad esempio sulla riga di comando (cli). Quindi dovresti usare __DIR__invece di $_SERVER['DOCUMENT_ROOT']. __DIR__restituisce il percorso del file php stesso.


2
E potresti usare __DIR__invece di $_SERVER['DOCUMENT_ROOT'].
Armin

Scusa se non ho spiegato correttamente la mia domanda, ciò di cui ho effettivamente bisogno è 'D: / workspace / MySystem'
Nalaka526

1
se il percorso della directory root è nella forma di / var / public / www ", utilizzando questo metodo la prima stringa nell'array sarà vuota (0) / (1) / (2) / (3). la root sarà la seconda stringa $ pathInPieces [1]
tbradley22


9

Voglio indicare il modo in cui Wordpress gestisce questo:

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

Poiché Wordpress è molto utilizzato in tutto il Web e funziona bene anche a livello locale, ho molta fiducia in questo metodo.


1
Immagino che funzioni solo quando hai due livelli di directory. Destra? Voglio dire, quando lo chiami da base_project_directory / cartella1 / cartella2 / cartella3 / file.php non restituisce base_project_directory.
Ali Khalili

"Poiché Wordpress è molto utilizzato in tutto il Web e funziona bene anche a livello locale, ho molta fiducia in questo metodo." Non credo che questo sia un argomento particolarmente valido data la qualità del codice WP e il track record di sicurezza.
Alex Barker

1
@AlexBarker Contesterei il fatto che tu stia insinuando che WP ha una cattiva esperienza di sicurezza. In realtà è abbastanza sicuro e ha un team reattivo focalizzato sulla sicurezza: core ha avuto pochissimi problemi di sicurezza sfruttati negli ultimi anni (anche quando hai commentato).
William Patton

3

Puoi provare: $_SERVER['PATH_TRANSLATED']

citazione:

Percorso basato sul file system (non sulla radice del documento) dello script corrente, dopo che il server ha eseguito una mappatura da virtuale a reale. Nota: a partire da PHP 4.3.2, PATH_TRANSLATEDnon è più impostato implicitamente sotto Apache 2 SAPI a differenza della situazione in Apache 1, dove è impostato sullo stesso valore della SCRIPT_FILENAMEvariabile del server quando non è popolata da Apache.
Questa modifica è stata apportata per conformarsi alla specifica CGI che PATH_TRANSLATED dovrebbe esistere solo se PATH_INFOdefinita. Gli utenti di Apache 2 possono utilizzare l' AcceptPathInfo = Oninterno httpd.confper definirePATH_INFO

fonte: php.net/manual


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

0

Sommario

Questo esempio presuppone che tu sappia sempre dove si trova la cartella principale di Apache "/ var / www /" e che tu stia cercando di trovare il percorso della cartella successiva (ad esempio "/ var / www / my_website_folder"). Anche questo funziona da uno script o dal browser web, motivo per cui è disponibile codice aggiuntivo.

Codice 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;
}

Esempio

echo getHtmlRootFolder();

Produzione:

/var/www/somedir/

Dettagli:

Fondamentalmente prima cerca di ottenere DOCUMENT_ROOT se contiene '/ var / www /', quindi usalo, altrimenti ottiene la directory corrente (che esiste molto all'interno del progetto) e ottiene il valore del percorso successivo in base al conteggio del percorso $ root. Nota: aggiunte istruzioni rtrim per garantire che il percorso restituisca la fine con una "/" in tutti i casi. Non controlla se deve essere più grande di / var / www / può anche restituire / var / www / come possibile risposta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.