IT TIP

PHP는 상대 경로를 포함합니다

itqueen 2020. 11. 30. 20:29
반응형

PHP는 상대 경로를 포함합니다


/root/update/test.php 파일이 있습니다. /root/connect.php 파일도 있습니다. 이 파일에는 한 줄이 있습니다.

include "../config.php";

/root/update/test.php에서. 코드가 있습니다

set_include_path(".:/root");
include "connect.php";

/root/update/test.php를 실행하면 connect.php를 찾지 만 config.php를 찾지 못해

PHP Warning:  include(../config.php): failed to open stream: No such file or directory in /root/connect.php on line 2
PHP Warning:  include(): Failed opening '../config.php' for inclusion (include_path='.:/root')

경고로 인해 모든 작업을 올바르게 수행하는 것처럼 보이기 때문에 혼란 스럽습니다. 포함 경로는 / root이고 존재하는 ../config.php(/config.php) 파일을 찾고 있습니다. 누군가 나를 위해 이것을 해결할 수 있습니까? 액세스 권한이없는 프로덕션 서버에 배포하기 때문에 절대 경로를 사용하는 것은 옵션이 아닙니다.

Ubuntu / Apache


항상 다음을 사용하여 포함 할 수 있습니다 __DIR__.

include(dirname(__DIR__).'/config.php');

__DIR__는 ' 마법의 상수 '이며 후행 슬래시없이 현재 파일의 디렉토리를 반환합니다. 실제로는 절대 경로이므로 파일 이름을 __DIR__. 이 경우 디렉토리 dirname를 올라 가야하므로 파일 트리를 올라가는 PHP를 사용 하고 여기에서 config.php.

이 방법에서도 루트 경로를 설정할 수 있습니다.

define('ROOT_PATH', dirname(__DIR__) . '/');

test.php에서 루트를 /root/수준 으로 설정합니다 .

include(ROOT_PATH.'config.php');

그런 다음 원하는 위치에서 구성 파일을 포함하도록 작업해야합니다.


난 당신이 절대 경로는 선택 사항이 아닙니다 믿고 감사 드리며, 그것은 이다 더 나은 상대 경로보다는 옵션과 PHP가 포함 경로를 업데이트.

환경에 따라 설정할 수있는 상수와 함께 절대 경로를 사용하십시오.

if (is_production()) {
    define('ROOT_PATH', '/some/production/path');
}
else {
    define('ROOT_PATH', '/root');
}

include ROOT_PATH . '/connect.php';

언급했듯이 ROOT_PATH현재 경로 $_SERVER['DOCUMENT_ROOT']등에서 파생 될 수도 있습니다 .


function relativepath($to){
    $a=explode("/",$_SERVER["PHP_SELF"] );
    $index= array_search("$to",$a);
    $str=""; 
    for ($i = 0; $i < count($a)-$index-2; $i++) {
        $str.= "../";
    }
    return $str;
    }

여기에 내가 만든 최상의 솔루션이 있습니다. 중지 할 수준을 지정하기 만하면되지만 문제는이 폴더 이름을 한 번 사용해야한다는 것입니다.

참고 URL : https://stackoverflow.com/questions/17407664/php-include-relative-path

반응형