Obtenir le chemin du répertoire racine d'un projet PHP

115

J'ai cette structure de dossiers dans mon projet PHP. (c'est comme indiqué dans les éclipses)

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

Quand j'essaye ce code

echo $_SERVER['DOCUMENT_ROOT']

la sortie est

D: / espace de travail

Comment puis-je obtenir le chemin d'accès à RootDirectory du système ( MySystem), sans coder en dur le nom du dossier?

Nalaka526
la source

Réponses:

146

Pour PHP> = 5.3.0 essayez

Constantes magiques PHP .

__DIR__

Et rendez votre chemin relatif.

Pour PHP <5.3.0, essayez

dirname(__FILE__)
Prasad Rajapaksha
la source
3
c'est juste génial, j'ai essayé $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'] etc. mais cela a très bien fonctionné!
webblover
78
Cela dépend de l'endroit où vous l'utilisez __DIR__ . Il est relatif au fichier lui-même, donc si dans un include, dans un sous-répertoire, il ne retournera pas uniquement votre répertoire racine.
Iris le
10
Il ne donnera pas de répertoire racine
inrsaurabh
1
note rapide pour quiconque tombe sur cette réponse à la recherche de la réponse à la question posée, DIR obtient le répertoire du fichier actuel et non la racine du projet, sauf si vous l'appelez dans un fichier qui se trouve à la racine du projet, mais comme php ne le fait pas ont le concept d'un projet tous les chemins doivent être absolus ou relatifs à l'emplacement actuel
MikeT
Veuillez ne pas voter pour une réponse qui ne répond pas correctement à la question, simplement parce qu'elle vous a aidé.
ElYeante le
73

Quand tu dis ça

$_SERVER['DOCUMENT_ROOT']

contient ce chemin:

D:/workspace

Alors D:c'est ce que vous cherchez, n'est-ce pas? Dans ce cas, vous pouvez exploser la chaîne par des barres obliques et renvoyer la première:

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

Cela affichera le répertoire racine du serveur.

Mise à jour: lorsque vous utilisez la constante DIRECTORY_SEPARATORau lieu de la barre oblique codée en dur ( '/'), ce code fonctionne également sous Windows.

Mise à jour 2: La $_SERVERvariable globale n'est pas toujours disponible. En ligne de commande (cli) par exemple. Vous devriez donc utiliser à la __DIR__place de $_SERVER['DOCUMENT_ROOT']. __DIR__renvoie le chemin du fichier php lui-même.

Armin
la source
2
Et vous pouvez utiliser à la __DIR__place de $_SERVER['DOCUMENT_ROOT'].
Armin
Désolé si je n'ai pas expliqué correctement ma question, ce dont j'ai réellement besoin est 'D: / workspace / MySystem'
Nalaka526
1
si le chemin de votre répertoire racine est sous la forme / var / public / www "alors en utilisant cette méthode, la première chaîne du tableau sera vide (0) / (1) / (2) / (3). la racine sera la deuxième chaîne $ pathInPieces [1]
tbradley22
36

utilisez la fonction PHP:

getcwd()

Obtient le répertoire de travail actuel.

Dkinzer
la source
1
Cela renvoie le chemin du fichier en cours d'exécution ACTUEL. Pas de chemin racine
Yousha Aleayoub
9

Je veux souligner la façon dont Wordpress gère cela:

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

Comme Wordpress est très utilisé sur le Web et fonctionne également très bien localement, j'ai beaucoup confiance en cette méthode.

Hexode
la source
1
Je suppose que cela ne fonctionne que lorsque vous avez deux niveaux de répertoires. Droite? Je veux dire, quand on l'appelle à partir de base_project_directory / folder1 / folder2 / folder3 / file.php, il ne renvoie pas le base_project_directory.
Ali Khalili le
"Comme Wordpress est très utilisé sur le Web et fonctionne également très bien localement, j'ai beaucoup confiance en cette méthode." Je ne pense pas que ce soit un argument particulièrement bon compte tenu de la qualité du code WP et des antécédents en matière de sécurité.
Alex Barker
1
@AlexBarker Je contesterais le fait que vous laissez entendre que WP a un mauvais bilan en matière de sécurité. Il est en fait assez sécurisé et dispose d'une équipe réactive axée sur la sécurité - le noyau a eu très peu de problèmes de sécurité exploités ces dernières années (y compris aussi loin que lorsque vous avez commenté).
William Patton
3

tu peux essayer: $_SERVER['PATH_TRANSLATED']

citation:

Chemin basé sur le système de fichiers (et non sur la racine du document) vers le script actuel, une fois que le serveur a effectué un mappage virtuel-réel. Remarque: Depuis PHP 4.3.2, PATH_TRANSLATEDn'est plus défini implicitement sous Apache 2 SAPI contrairement à la situation dans Apache 1, où il est défini sur la même valeur que la SCRIPT_FILENAMEvariable serveur lorsqu'elle n'est pas remplie par Apache.
Cette modification a été apportée pour se conformer à la spécification CGI selon laquelle PATH_TRANSLATED ne doit exister que s'il PATH_INFOest défini. Les utilisateurs d'Apache 2 peuvent utiliser AcceptPathInfo = Oninside httpd.confpour définirPATH_INFO

source: php.net/manual

C'est moi
la source
1
echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;
Waqar Alamgir
la source
0

Résumé

Cet exemple suppose que vous savez toujours où se trouve le dossier racine d'Apache '/ var / www /' et que vous essayez de trouver le chemin du dossier suivant (par exemple, '/ var / www / my_website_folder'). Cela fonctionne également à partir d'un script ou du navigateur Web, c'est pourquoi il existe du code supplémentaire.

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

Exemple

echo getHtmlRootFolder();

Production:

/var/www/somedir/

Détails:

En gros, essaie d'abord d'obtenir DOCUMENT_ROOT s'il contient '/ var / www /', puis utilisez-le, sinon obtenez le répertoire actuel (qui existe beaucoup dans le projet) et obtient la valeur du chemin suivant en fonction du nombre de $ chemin racine. Remarque: ajout d'instructions rtrim pour s'assurer que le chemin retourne se terminant par un «/» dans tous les cas. Il ne vérifie pas s'il doit être plus grand que / var / www / il peut également renvoyer / var / www / comme réponse possible.

Mike Q
la source