source

처음 실행된 스크립트의 절대 경로를 가져옵니다.

manysource 2022. 11. 4. 23:32

처음 실행된 스크립트의 절대 경로를 가져옵니다.

나는 모든 곳을 찾아보고 절대 경로를 얻기 위해 정보를 포함하는 많은 다양한 솔루션과 변수를 얻습니다.하지만 그들은 어떤 조건에서는 일하는 것 같고 다른 조건에서는 일하는 것 같지 않다.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.phpC:\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