PHP 프로젝트의 루트 디렉토리 경로 가져 오기


115

내 PHP 프로젝트에이 폴더 구조가 있습니다. (이것은 일식에 표시된 것과 같습니다)

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

이 코드를 시도하면

echo $_SERVER['DOCUMENT_ROOT']

출력은

D : / 작업 공간

MySystem폴더 이름을 하드 코딩하지 않고 시스템 ( )의 RootDirectory 경로를 얻으려면 어떻게 해야합니까?

답변:


146

내용은 PHP> = 5.3.0 시도

PHP 매직 상수 .

__DIR__

그리고 경로를 상대적으로 만드십시오.

대한 PHP <5.3.0 시도

dirname(__FILE__)

3
이것은 대단합니다. $ _SERVER [ 'DOCUMENT_ROOT'], dirname (), $ _SERVER [ 'SCRIPT_NAME'] 등을 시도했지만 이것은 훌륭하게 작동했습니다!
webblover 2014

78
사용하는 위치에 따라 다릅니다 __DIR__ . 파일 자체에 상대적이므로 포함 된 경우 하위 디렉터리 내에있는 경우 루트 디렉터리 만 반환하지 않습니다.
Iris

10
이 루트 디렉토리를 제공하지 않습니다
inrsaurabh

1
질문에 대한 답변을 찾고있는이 답변을 우연히 발견 한 사람을위한 빠른 메모, DIR 은 프로젝트 루트에있는 파일에서 호출하지 않는 한 프로젝트 루트가 아닌 현재 파일의 디렉토리를 얻지 만 php는 그렇지 않습니다. 모든 경로가 현재 위치에 대해 절대적이거나 상대적이어야한다는 프로젝트의 개념을 가지고 있어야합니다
MikeT

도움이되었다고해서 질문을 올바르게 다루지 않는 답변은 찬성하지 마십시오.
ElYeante

73

당신이 그렇게 말할 때

$_SERVER['DOCUMENT_ROOT']

다음 경로를 포함합니다.

D:/workspace

그렇다면 D:당신이 찾고있는 것이 맞죠? 이 경우 슬래시로 문자열을 분해하고 첫 번째 문자열을 반환 할 수 있습니다.

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

이것은 서버의 루트 디렉토리를 출력합니다.

업데이트 : 당신이 상수를 사용하는 경우 DIRECTORY_SEPARATOR(하드 코딩 된 슬래시 대신 '/'이 코드는 Windows에서 작동).

2 업데이트 :$_SERVER 전역 변수는 항상 사용할 수 없습니다. 예를 들어 명령 줄 (cli)에서. 따라서 __DIR__대신 $_SERVER['DOCUMENT_ROOT']. __DIR__PHP 파일 자체의 경로를 반환합니다.


2
그리고 __DIR__대신 사용할 수 있습니다 $_SERVER['DOCUMENT_ROOT'].
Armin

죄송합니다 제 질문을 제대로 설명하지 못했다면 실제로 필요한 것은 'D : / workspace / MySystem'입니다.
Nalaka526 dec

1
루트 디렉토리 경로가 / var / public / www "형식이면이 메서드를 사용하면 배열의 첫 번째 문자열이 비어 있습니다 (0) / (1) / (2) / (3). 루트는 두 번째 문자열 $ pathInPieces [1]
tbradley22

36

PHP 기능을 사용하십시오.

getcwd()

현재 작업 디렉토리를 가져옵니다.


1
CURRENT 실행 파일 경로를 반환합니다. 루트 경로 아님
Yousha Aleayoub

9

Wordpress가 이것을 처리하는 방법을 가리키고 싶습니다.

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

Wordpress는 웹 전체에서 매우 많이 사용되며 로컬에서도 잘 작동하므로이 방법을 많이 신뢰합니다.


1
두 수준의 디렉토리가있을 때만 작동한다고 생각합니다. 권리? 내 말은, base_project_directory / folder1 / folder2 / folder3 / file.php에서 호출하면 base_project_directory를 반환하지 않습니다.
Ali Khalili 2019

"Wordpress는 웹 전체에서 매우 많이 사용되며 로컬에서도 잘 작동하기 때문에이 방법을 많이 신뢰합니다." WP 코드 품질과 보안 실적을 고려할 때 이것이 특히 좋은 주장이라고 생각하지 않습니다.
Alex Barker

1
@AlexBarker WP가 보안 실적이 좋지 않다는 암시에 이의를 제기합니다. 실제로 꽤 안전하고 보안에 중점을 둔 반발 팀이 있습니다. 코어는 최근 몇 년 동안 악용 된 보안 문제가 거의 없었습니다 (댓글을 올린 시점까지 포함).
William Patton

3

당신은 시도 할 수 있습니다: $_SERVER['PATH_TRANSLATED']

인용문:

서버가 가상-실제 매핑을 수행 한 후 현재 스크립트에 대한 파일 시스템 (문서 루트 아님) 기반 경로입니다. 참고 : PHP 4.3.2 PATH_TRANSLATED부터는 SCRIPT_FILENAMEApache에 의해 채워지지 않을 때 서버 변수 와 동일한 값으로 설정되는 Apache 1의 상황과 달리 더 이상 Apache 2 SAPI에서 암시 적으로 설정 되지 않습니다.
이 변경은 PATH_TRANSLATED PATH_INFO가 정의 된 경우에만 존재해야하는 CGI 사양을 준수하기 위해 이루어졌습니다 . Apache 2 사용자는 AcceptPathInfo = On내부 httpd.conf를 사용 하여PATH_INFO

출처 : php.net/manual



0

요약

이 예제에서는 아파치 루트 폴더가 '/ var / www /'인 위치를 항상 알고 있고 다음 폴더 경로 (예 : '/ var / www / my_website_folder')를 찾으려고한다고 가정합니다. 또한 이것은 스크립트 또는 웹 브라우저에서 작동하므로 추가 코드가 있습니다.

코드 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;
}

echo getHtmlRootFolder();

산출:

/var/www/somedir/

세부:

기본적으로 먼저 '/ var / www /'가 포함 된 경우 DOCUMENT_ROOT를 얻은 다음 사용하고, 그렇지 않으면 현재 디렉터리 (프로젝트 내부에 많이 존재 함)를 가져와 $ root 경로 수에 따라 다음 경로 값을 가져옵니다. 참고 : 경로가 모든 경우에 '/'로 끝나는 반환을 보장하기 위해 rtrim 문이 추가되었습니다. / var / www /보다 커야하는지 확인하지 않고 가능한 응답으로 / var / www /를 반환 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.