Obtener la ruta del directorio raíz de un proyecto PHP

115

Tengo esta estructura de carpetas en mi proyecto PHP. (esto es como se muestra en eclips)

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

Cuando pruebo este código

echo $_SERVER['DOCUMENT_ROOT']

la salida es

D: / espacio de trabajo

¿Cómo puedo obtener la ruta al directorio raíz del sistema ( MySystem), sin codificar el nombre de la carpeta?

Nalaka526
fuente

Respuestas:

146

Para PHP> = 5.3.0 intente

Constantes mágicas de PHP .

__DIR__

Y haz tu camino relativo.

Para PHP <5.3.0 intente

dirname(__FILE__)
Prasad Rajapaksha
fuente
3
esto es simplemente increíble, probé $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'], etc. ¡pero funcionó de manera excelente!
webblover
78
Depende de dónde lo uses __DIR__ . Es relativo al archivo en sí, por lo que si está en una inclusión, dentro de un subdirectorio, no devolverá solo su directorio raíz.
Iris
10
No dará el directorio raíz
inrsaurabh
1
nota rápida para cualquiera que se encuentre con esta respuesta buscando la respuesta a la pregunta formulada, DIR obtiene el directorio del archivo actual, no la raíz del proyecto, a menos que lo llame en un archivo que está en la raíz del proyecto, pero como php no lo hace tener el concepto de un proyecto, todas las rutas deben ser absolutas o relativas a la ubicación actual
MikeT
Por favor, no vote a favor de una respuesta que no aborde correctamente la pregunta, solo porque le ayudó.
ElYeante
73

Cuando dices eso

$_SERVER['DOCUMENT_ROOT']

contiene esta ruta:

D:/workspace

Entonces D:es lo que estás buscando, ¿no? En ese caso, puede explotar la cadena con barras y devolver la primera:

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

Esto generará el directorio raíz del servidor.

Actualización: cuando usa la constante en DIRECTORY_SEPARATORlugar de la barra inclinada codificada ( '/'), este código también funciona en Windows.

Actualización 2: La $_SERVERvariable global no siempre está disponible. En la línea de comando (cli) por ejemplo. Entonces deberías usar en __DIR__lugar de $_SERVER['DOCUMENT_ROOT']. __DIR__devuelve la ruta del archivo php en sí.

Armin
fuente
2
Y podrías usar en __DIR__lugar de $_SERVER['DOCUMENT_ROOT'].
Armin
Lo siento Si no he explicado mi pregunta correctamente, lo que realmente necesito es 'D: / workspace / MySystem'
Nalaka526
1
si la ruta del directorio raíz tiene el formato / var / public / www ", al usar este método, la primera cadena de la matriz estará vacía (0) / (1) / (2) / (3). la raíz será la segunda cadena $ pathInPieces [1]
tbradley22
36

usa la función PHP:

getcwd()

Obtiene el directorio de trabajo actual.

dkinzer
fuente
1
Esto devuelve la ruta del archivo de ejecución ACTUAL.
Ruta
9

Quiero señalar la forma en que Wordpress maneja esto:

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

Como Wordpress se usa mucho en toda la web y también funciona bien a nivel local, tengo mucha confianza en este método.

Hexodus
fuente
1
Supongo que esto solo funciona cuando tienes dos niveles de directorios. ¿Correcto? Quiero decir, cuando lo llamo desde base_project_directory / folder1 / folder2 / folder3 / file.php no devuelve el base_project_directory.
Ali Khalili
"Como Wordpress se usa mucho en toda la web y también funciona bien a nivel local, confío mucho en este método". No creo que este sea un argumento particularmente bueno dado el historial de calidad y seguridad del código WP.
Alex Barker
1
@AlexBarker Yo refutaría el hecho de que insinúes que WP tiene un historial de seguridad malo. En realidad, es bastante seguro y tiene un equipo respinsivo centrado en la seguridad: el núcleo ha tenido muy pocos problemas de seguridad explotados en los últimos años (incluso desde cuando usted comentó).
William Patton
3

puedes probar: $_SERVER['PATH_TRANSLATED']

citar:

Ruta basada en el sistema de archivos (no en la raíz del documento) al script actual, después de que el servidor haya realizado cualquier asignación de virtual a real. Nota: A partir de PHP 4.3.2, PATH_TRANSLATEDya no se establece implícitamente en Apache 2 SAPI a diferencia de la situación en Apache 1, donde se establece en el mismo valor que la SCRIPT_FILENAMEvariable del servidor cuando no está poblado por Apache.
Este cambio se realizó para cumplir con la especificación CGI de que PATH_TRANSLATED solo debería existir si PATH_INFOestá definido. Los usuarios de Apache 2 pueden usar AcceptPathInfo = Oninside httpd.confpara definirPATH_INFO

fuente: php.net/manual

Este soy yo
fuente
1
echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;
Waqar Alamgir
fuente
0

Resumen

Este ejemplo asume que siempre sabe dónde está la carpeta raíz de Apache '/ var / www /' y está tratando de encontrar la siguiente ruta de carpeta (por ejemplo, '/ var / www / my_website_folder'). También esto funciona desde un script o el navegador web, por lo que hay un código adicional.

Código 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;
}

Ejemplo

echo getHtmlRootFolder();

Salida:

/var/www/somedir/

Detalles:

Básicamente, primero intenta obtener DOCUMENT_ROOT si contiene '/ var / www /' y luego úselo, de lo contrario, obtenga el directorio actual (que existe dentro del proyecto) y obtiene el siguiente valor de ruta basado en el recuento de la ruta $ root. Nota: se agregaron declaraciones rtrim para garantizar que la ruta regrese terminando con '/' en todos los casos. No comprueba si requiere ser más grande que / var / www / también puede devolver / var / www / como posible respuesta.

Mike Q
fuente