Obtenha o caminho do diretório raiz de um projeto PHP

115

Eu tenho essa estrutura de pastas no meu projeto PHP. (isso é mostrado em eclips)

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

Quando eu tento este código

echo $_SERVER['DOCUMENT_ROOT']

saída é

D: / espaço de trabalho

Como posso obter o caminho para RootDirectory do sistema ( MySystem), sem codificar o nome da pasta?

Nalaka526
fonte

Respostas:

146

Para PHP> = 5.3.0 tente

Constantes mágicas do PHP .

__DIR__

E torne seu caminho relativo.

Para PHP <5.3.0, tente

dirname(__FILE__)
Prasad Rajapaksha
fonte
3
isto é simplesmente fantástico, tentei $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'] etc. mas funcionou perfeitamente!
webblover
78
Depende de onde você usa __DIR__ . É relativo ao próprio arquivo, portanto, se estiver em um include, dentro de um subdiretório, não retornará apenas o seu diretório raiz.
Iris
10
Não fornecerá o diretório raiz
inrsaurabh
1
nota rápida para qualquer um que encontrar esta resposta procurando a resposta da pergunta feita, DIR obtém o diretório do arquivo atual não a raiz do projeto a menos que você o chame em um arquivo que está na raiz do projeto, mas como php não ter o conceito de um projeto, todos os caminhos devem ser absolutos ou relativos ao local atual
MikeT
Por favor, não vote positivamente em uma resposta que não responda corretamente à pergunta, apenas porque ajudou você.
ElYeante
73

Quando você diz isso

$_SERVER['DOCUMENT_ROOT']

contém este caminho:

D:/workspace

Então D:é isso que você está procurando, não é? Nesse caso, você pode explodir a string por barras e retornar a primeira:

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

Isso produzirá o diretório raiz do servidor.

Atualização: Quando você usa a constante em DIRECTORY_SEPARATORvez da barra codificada ( '/'), este código também funciona no Windows.

UPDATE 2: A $_SERVERvariável global não está sempre disponível. Na linha de comando (CLI), por exemplo. Portanto, você deve usar em __DIR__vez de $_SERVER['DOCUMENT_ROOT']. __DIR__retorna o caminho do próprio arquivo php.

Armin
fonte
2
E você pode usar em __DIR__vez de $_SERVER['DOCUMENT_ROOT'].
Armin
Desculpe se eu não expliquei minha pergunta corretamente, o que eu realmente preciso é de 'D: / workspace / MySystem'
Nalaka526
1
se o caminho do seu diretório raiz estiver no formato / var / public / www ", então, usando este método, a primeira string na matriz ficará vazia (0) / (1) / (2) / (3). a raiz será a segunda string $ pathInPieces [1]
tbradley22
36

use a função PHP:

getcwd()

Obtém o diretório de trabalho atual.

Dkinzer
fonte
1
Isso retorna o caminho do arquivo CURRENT em execução. Caminho não raiz
Yousha Aleayoub
9

Eu quero apontar como o Wordpress lida com isso:

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

Como o Wordpress é muito usado em toda a web e também funciona bem localmente, confio muito neste método.

Hexodus
fonte
1
Acho que isso só funciona quando você tem dois níveis de diretórios. Certo? Quer dizer, ao chamá-lo de base_project_directory / folder1 / folder2 / folder3 / file.php ele não retorna o base_project_directory.
Ali Khalili
"Como o Wordpress é muito usado em toda a web e também funciona bem localmente, tenho muita confiança neste método." Não acredito que este seja um argumento particularmente bom, considerando a qualidade do código WP e o histórico de segurança.
Alex Barker
1
@AlexBarker Eu contestaria o fato de você estar insinuando que o WP tem um histórico ruim de segurança. Na verdade, é muito seguro e tem uma equipe respinsiva focada na segurança - o core teve muito poucos problemas de segurança explorados nos últimos anos (incluindo quando você comentou).
William Patton
3

podes tentar: $_SERVER['PATH_TRANSLATED']

citar:

Caminho baseado no sistema de arquivos (não na raiz do documento) para o script atual, após o servidor ter feito qualquer mapeamento virtual para real. Nota: A partir do PHP 4.3.2, PATH_TRANSLATEDnão é mais definido implicitamente no Apache 2 SAPI em contraste com a situação no Apache 1, onde é definido com o mesmo valor da SCRIPT_FILENAMEvariável do servidor quando não é preenchido pelo Apache.
Esta alteração foi feita para cumprir a especificação CGI de que PATH_TRANSLATED só deve existir se PATH_INFOestiver definido. Os usuários do Apache 2 podem usar AcceptPathInfo = Ondentro httpd.confpara definirPATH_INFO

fonte: php.net/manual

Este sou eu
fonte
1
echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;
Waqar Alamgir
fonte
0

Resumo

Este exemplo assume que você sempre sabe onde está a pasta raiz do apache '/ var / www /' e está tentando encontrar o próximo caminho de pasta (por exemplo, '/ var / www / my_website_folder'). Também funciona a partir de um script ou do navegador da web, por isso existe um 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;
}

Exemplo

echo getHtmlRootFolder();

Resultado:

/var/www/somedir/

Detalhes:

Basicamente, primeiro tenta obter DOCUMENT_ROOT se ele contém '/ var / www /' e então usa-o, senão obtém o diretório atual (que existe dentro do projeto) e obtém o próximo valor do caminho baseado na contagem do caminho $ root. Nota: instruções rtrim adicionadas para garantir que o caminho retorne terminando com '/' em todos os casos. Ele não verifica se precisa ser maior que / var / www /, mas também pode retornar / var / www / como uma resposta possível.

Mike Q
fonte