처음 실행된 스크립트의 절대 경로를 가져옵니다.
나는 모든 곳을 찾아보고 절대 경로를 얻기 위해 정보를 포함하는 많은 다양한 솔루션과 변수를 얻습니다.하지만 그들은 어떤 조건에서는 일하는 것 같고 다른 조건에서는 일하는 것 같지 않다.PHP에서 실행된 스크립트의 절대 경로를 얻기 위한 Silver Bullet 방법이 있습니까?스크립트는 명령줄에서 실행되지만 솔루션은 Apache 등에서 실행해도 정상적으로 기능합니다.
설명:처음에 실행된 스크립트.솔루션이 코드화되어 있는 파일은 아닙니다.
__FILE__
는 현재 합니다.
업데이트:
질문이 현재 실행 중인 스크립트가 아닌 처음 실행된 스크립트를 가져오는 방법을 묻도록 변경되었습니다.신뢰할 수 있는 유일한 방법은 기능을 사용하는 것입니다.
$stack = debug_backtrace();
$firstFrame = $stack[count($stack) - 1];
$initialFile = $firstFrame['file'];
echo realpath(dirname(__FILE__));
이 파일을 포함된 파일에 배치하면 포함에 대한 경로가 인쇄 경로가 표시됩니다.스크립트의 하려면 , 를 합니다.__FILE__
$_SERVER['PHP_SELF']
입니다!」, PHP_SELF는 보안 리스크입니다.
올바른 해결책은 다음 기능을 사용하는 것입니다.
list($scriptPath) = get_included_files();
이렇게 하면 다음과 같은 경우에도 초기 스크립트의 절대 경로를 얻을 수 있습니다.
- 이 함수는 포함된 파일 내에 배치됩니다.
- 현재 작업 디렉토리가 초기 스크립트의 디렉토리와 다릅니다.
- 스크립트는 CLI를 사용하여 상대 경로로 실행됩니다.
메인 스크립트와 포함된 파일의 2가지 테스트스크립트를 다음에 나타냅니다.
# C:\Users\Redacted\Desktop\main.php
include __DIR__ . DIRECTORY_SEPARATOR . 'include.php';
echoScriptPath();
# C:\Users\Redacted\Desktop\include.php
function echoScriptPath() {
list($scriptPath) = get_included_files();
echo 'The script being executed is ' . $scriptPath;
}
그 결과, 현재의 디렉토리에 주목해 주세요.
C:\>php C:\Users\Redacted\Desktop\main.php
The script being executed is C:\Users\Redacted\Desktop\main.php
__DIR__
매뉴얼:
파일의 디렉토리.include가 반환됩니다.include는 include 파일의 디렉토리입니다.이것은 에 상당합니다. dirname(__FILE__)
. 이디렉토리가 한 이 디렉토리 이름에는 루트 디렉토리가 아닌 한 후행 슬래시가 없습니다.
__FILE__
에는 항상 심볼링크가 해결된 절대 경로가 포함되어 있습니다.구 버전(4.0.2보다 이전 버전)에서는 상황에 따라 상대 경로가 포함되어 있습니다.
주의:__DIR__
PHP 5.3.0입니다.
현재 작업 디렉토리 사용을 가져오려면getcwd()
http://php.net/manual/en/function.getcwd.php
__FILE__
는, 예를 의 합니다.C:\xampp\htdocs\index.php
C:\xampp\htdocs\
dirname(__FILE__)
는, 루트를 요구하는 현재의 파일의 절대 루트, 즉 서버 디렉토리의 루트를 지정합니다.
파일 예:
www/syslog/syslogs/index.syslogs; 이 코드를 인덱스 안에 넣으면 다음과 같이 반환됩니다.
<?php echo dirname(__FILE__); // this will return: www/http/html/
www/myclass/myclass.php ; 이 코드를 myclass에 넣을 경우.php 반환:
<?php echo dirname(__FILE__); // this will return: www/http/html/class/
아래를 사용하세요.
echo __DIR__;
`realpath(dirname(__FILE__))`
후행 슬래시 없이 현재 스크립트(이 코드를 삽입한 스크립트) 디렉토리를 제공합니다.이것은 결과에 다른 파일을 포함시키고 싶은 경우에 중요합니다.
서버 루트에 상대적인 절대 경로를 찾고 있는 경우, 다음과 같이 올바르게 동작합니다.
$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])
여기 제가 이것을 위해 정확히 쓴 유용한 PHP 함수가 있습니다.첫 번째 질문에서 설명한 것처럼 현재 파일이 아닌 초기 스크립트가 실행된 경로를 반환합니다.
/**
* Get the file path/dir from which a script/function was initially executed
*
* @param bool $include_filename include/exclude filename in the return string
* @return string
*/
function get_function_origin_path($include_filename = true) {
$bt = debug_backtrace();
array_shift($bt);
if ( array_key_exists(0, $bt) && array_key_exists('file', $bt[0]) ) {
$file_path = $bt[0]['file'];
if ( $include_filename === false ) {
$file_path = str_replace(basename($file_path), '', $file_path);
}
} else {
$file_path = null;
}
return $file_path;
}
처음 실행한 스크립트의 절대 경로를 해당 스크립트와 기타 스크립트에 포함시키는 간단한 방법include
,require
,require_once
는 상수를 사용하여 메인스크립트 선두에 현재 스크립트 경로를 저장합니다.
define( 'SCRIPT_ROOT', __FILE__ );
위의 솔루션은 다음과 같은 단일 "메인" 스크립트가 있는 경우에 적합합니다.include
는 대부분의 웹 어플리케이션과 마찬가지로 필요한 다른 모든 스크립트입니다.
그렇지 않고 여러 개의 "초기 스크립트"가 있을 수 있는 경우 정의를 회피하고 올바른 경로를 상수 내에 저장하기 위해 각 스크립트는 다음과 같이 시작할 수 있습니다.
if( ! defined( 'SCRIPT_ROOT' ) ) {
define( 'SCRIPT_ROOT`, __FILE__ );
}
(현재) 승인된 답변에 대한 메모:
응답은 처음에 실행된 스크립트 경로가 에 의해 반환된 배열의 첫 번째 요소임을 나타냅니다.get_included_files()
.
이것은 영리하고 간단한 솔루션이며, (우리는 PHP 7.4.0에 거의 도달했습니다) 그것은 동작합니다.
다만, 메뉴얼을 참조하면, 최초로 실행된 스크립트가, 에 의해서 반환된 어레이의 첫 번째 항목이라는 것은 언급되지 않습니다.get_included_files()
.
우리는 책만 읽는다.
원래 호출된 스크립트는 "포함 파일"로 간주되므로 include 및 family에서 참조하는 파일과 함께 나열됩니다.
작성 시 "원래 호출된 스크립트"가 배열의 첫 번째 스크립트이지만, 엄밀히 말하면 이 스크립트가 앞으로도 변경되지 않을 것이라는 보장은 없습니다.
에 대한 주의사항realpath()
,__FILE__
,그리고.__DIR__
:
다른 사람들은 그들의 답변에서 다음과 같은 사용을 제안했다.__FILE__
,__DIR__
,dirname(__FILE__)
,realpath(__DIR__)
dirname(__FILE__)
__DIR__
5.되어 있기 에, (PHP 5.3.0)을 사용해 .__DIR__
.
다.__FILE__
★★★★★★★★★★★★★★★★★」__DIR__
항상 절대적인 경로이기 때문에realpath()
필요합합니니다
realpath($_SERVER['SCRIPT_FILENAME'])
되는 $_SERVER['SCRIPT_FILENAME']
에는 최초 호출된 스크립트에 대한 풀경로가 포함되어 있기 때문에 아마 index.display가 포함되어 있을 것입니다. realpath()
이 경우 는 필요하지 않습니다.
console에서 $_SERVER['SCRIPT_FILENAME']
에는 현재 작업 중인 dir에서 처음 호출된 스크립트에 대한 상대 경로가 포함됩니다.따라서 스크립트 내에서 작업 디렉토리를 변경하지 않는 한 절대 경로로 해결됩니다.
이것을 당신의 대본에 써보세요.
echo getcwd() . "\n";
이것은 제가 사용하고 있는 것으로 Linux 환경에서 동작합니다.Windows 머신에서는 동작하지 않을 것 같습니다만...
//define canonicalized absolute pathname for the script
if(substr($_SERVER['SCRIPT_NAME'],0,1) == DIRECTORY_SEPARATOR) {
//does the script name start with the directory separator?
//if so, the path is defined from root; may have symbolic references so still use realpath()
$script = realpath($_SERVER['SCRIPT_NAME']);
} else {
//otherwise prefix script name with the current working directory
//and use realpath() to resolve symbolic references
$script = realpath(getcwd() . DIRECTORY_SEPARATOR . $_SERVER['SCRIPT_NAME']);
}
언급URL : https://stackoverflow.com/questions/4645082/get-absolute-path-of-initially-run-script
'source' 카테고리의 다른 글
MAMP에 포함된 MySQL에는 구성 파일이 포함되어 있지 않습니까? (0) | 2022.11.05 |
---|---|
PHP에서 PUT/DELETE 인수 처리 (0) | 2022.11.04 |
MySQL SELECT 증분 카운터 (0) | 2022.11.04 |
그림에 호버링 주석을 추가하는 방법 (0) | 2022.11.04 |
Java .class 파일을 사람이 읽을 수 있는 방법으로 열려면 어떻게 해야 합니까? (0) | 2022.11.04 |