답변:
__DIR__
. 파일 자체에 상대적이므로 포함 된 경우 하위 디렉터리 내에있는 경우 루트 디렉터리 만 반환하지 않습니다.
당신이 그렇게 말할 때
$_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 파일 자체의 경로를 반환합니다.
__DIR__
대신 사용할 수 있습니다 $_SERVER['DOCUMENT_ROOT']
.
Wordpress가 이것을 처리하는 방법을 가리키고 싶습니다.
define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );
Wordpress는 웹 전체에서 매우 많이 사용되며 로컬에서도 잘 작동하므로이 방법을 많이 신뢰합니다.
당신은 시도 할 수 있습니다:
$_SERVER['PATH_TRANSLATED']
인용문:
서버가 가상-실제 매핑을 수행 한 후 현재 스크립트에 대한 파일 시스템 (문서 루트 아님) 기반 경로입니다. 참고 : PHP 4.3.2
PATH_TRANSLATED
부터는SCRIPT_FILENAME
Apache에 의해 채워지지 않을 때 서버 변수 와 동일한 값으로 설정되는 Apache 1의 상황과 달리 더 이상 Apache 2 SAPI에서 암시 적으로 설정 되지 않습니다.
이 변경은 PATH_TRANSLATEDPATH_INFO
가 정의 된 경우에만 존재해야하는 CGI 사양을 준수하기 위해 이루어졌습니다 . Apache 2 사용자는AcceptPathInfo = On
내부httpd.conf
를 사용 하여PATH_INFO
출처 : php.net/manual
echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;
요약
이 예제에서는 아파치 루트 폴더가 '/ 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 /를 반환 할 수도 있습니다.