PHP 상대 포함 경로와 관련된 규칙 세트를 이해하는 데 문제가 있습니다. 파일 A.PHP-를 실행하고 파일 A.PHP에 파일 C.PHP를 포함하는 파일 B.PHP가 포함되어있는 경우 C.PHP의 상대 경로가 B.PHP의 위치 또는 A의 위치와 관련이 있어야합니다. .PHP? 즉, include가 어떤 파일 에서 호출되었는지, 아니면 현재 작업 디렉토리가 무엇이며 현재 작업 디렉토리를 결정하는 것이 중요합니까?
PHP 상대 포함 경로와 관련된 규칙 세트를 이해하는 데 문제가 있습니다. 파일 A.PHP-를 실행하고 파일 A.PHP에 파일 C.PHP를 포함하는 파일 B.PHP가 포함되어있는 경우 C.PHP의 상대 경로가 B.PHP의 위치 또는 A의 위치와 관련이 있어야합니다. .PHP? 즉, include가 어떤 파일 에서 호출되었는지, 아니면 현재 작업 디렉토리가 무엇이며 현재 작업 디렉토리를 결정하는 것이 중요합니까?
답변:
기본 스크립트 (이 경우 A.php)에 상대적입니다. 그 기억 include()
은 현재 실행중인 스크립트에 바로 삽입 코드를.
즉, include가 호출되는 파일이 중요합니까?
아니.
당신이하려는 경우 확인 문제를, 그리고는 B.php를 기준으로 포함 할, 사용 __FILE__
상수 (또는 __DIR__
PHP 5.2 IIRC부터) 리터럴 현재 파일에 항상 점 코드의 라인에 위치하는 것이다.
include(dirname(__FILE__)."/C.PHP");
__DIR__
정확한 목적으로 사용할 수도 있습니다 .
include(dirname(__FILE__)."/C.PHP");
, 왜냐하면 include("C.PHP");
충분 하기 때문 입니다 (예! C.PHP는 B.PHP와 동일한 디렉토리에있을 수 있습니다). 프로젝트에 두 개의 C.PHP 파일이있을 때만 실패 할 수 있습니다.
@Pekka가 저를 데려 왔지만 제가 배운 것을 공유하고 싶습니다.
getcwd()
실행을 시작한 파일이있는 디렉토리를 반환합니다.
dirname(__FILE__)
현재 실행중인 코드를 포함하는 파일의 디렉토리를 반환합니다.
이 두 가지 함수를 사용하면 항상 필요한 항목과 관련된 포함 경로를 만들 수 있습니다.
예를 들어 b.php와 c.php가 디렉토리를 공유하는 경우 b.php는 다음과 같이 c.php를 포함 할 수 있습니다.
include(dirname(__FILE__).'/c.php');
b.php가 어디에서 호출 되든 상관 없습니다.
실제로 이것은 추가 코드가 대상 파일을 찾으려고 할 때 include_path를 반복 할 필요가 없도록 PHP를 해제하기 때문에 상대 경로를 설정하는 선호되는 방법입니다.
출처 :
포함 경로가 ./
또는로 시작하지 않는 경우 ../
, 예 :
include 'C.php'; // precedence: include_path (which include '.' at first),
// then path of current `.php` file (i.e. `B.php`), then `.`.
포함 경로가 ./
또는 로 시작하는 경우 ../
, 예 :
include './C.php'; // relative to '.'
include '../C.php'; // also relative to '.'
.
또는 ..
위가를 기준으로 getcwd()
항목의 경로에있는 디폴트 .php
파일 (예 A.php
).
PHP 5.4.3 (빌드 날짜 : 2012 년 5 월 8 일 00:47:34)에서 테스트되었습니다.
(또한 chdir()
의 출력을 변경할 수 있습니다 getcwd()
.)
chdir(__DIR__)
문제를 해결하는 데 사용 하도록 도와 주셔서 감사합니다 .
getcwd()
, 기본값은 .php 파일 [...]의 경로입니다 . 반드시 사실은 아닙니다. 명령 줄에서 PHP를 실행하면 호출 getcwd()
하는 .php
파일에 관계없이 쉘의 현재 작업 디렉토리 를 참조합니다 . 하지만 PHP가 웹 서버 환경에서 실행되는 경우 환경이 현재 작업 디렉토리를 항목 .php
파일 로 초기화한다고 상상할 수 있습니다 . Homebrew를 통해 PHP 7.2.2가 설치된 macOS에서 테스트되었습니다.
Pekka의 허용 된 답변은 불완전하며 일반적인 맥락에서 오해의 소지가 있습니다. 파일이 상대 경로로 제공되는 경우 호출 된 언어 구문 include
은 다음과 같은 방법 으로 파일 을 검색합니다.
먼저 환경 변수의 경로를 통과 include_path
하며 ini_set
. 이것이 실패하면 호출하는 스크립트의 자체 디렉토리 dirname(__FILE__)
( __DIR__
php> = 5.3 사용)에서 검색합니다. 이것도 실패하면 작업 디렉토리에서만 검색합니다! 기본적으로 환경 변수 include_path
는 .
현재 작업 디렉토리 인으로 시작합니다. 이것이 현재 작업 디렉토리에서 먼저 검색하는 유일한 이유입니다. http://php.net/manual/en/function.include.php를 참조 하십시오 .
파일은 주어진 파일 경로 또는 지정된 경로가 없으면 include_path를 기반으로 포함됩니다. include_path에서 파일을 찾을 수 없으면 include는 실패하기 전에 마지막으로 호출 스크립트의 자체 디렉토리와 현재 작업 디렉토리를 확인합니다.
따라서 질문의 첫 번째 부분에 대한 정답은 포함 된 호출 스크립트의 위치가 중요하다는 것입니다. 질문의 마지막 부분에 대한 답은 웹 서버 컨텍스트에서 초기 작업 디렉토리가 PHP에 의해 처리되는 동안 다른 모든 것을 포함하는 스크립트 인 호출 된 스크립트의 디렉토리라는 것입니다. 명령 줄 컨텍스트에서 초기 작업 디렉토리는 php가 프롬프트에서 호출 될 때의 디렉토리이며 호출 된 스크립트가있는 디렉토리 일 필요는 없습니다. 그러나 현재 작업 디렉토리는 PHP 함수를 사용하여 런타임에 변경할 수 있습니다 chdir
. http://php.net/manual/en/function.chdir.php를 참조 하십시오 .
이 단락은 다른 답변에 대한 의견을 추가합니다. 일부에 의존하는 것을 언급 한 include_path
적은 강력하고 따라서 같은 전체 경로를 사용하는 것이 바람직하다 ./path
또는 __DIR__ . /path
. 어떤 사람들은 작업 디렉토리 .
자체 에 의존하는 것은 변경 될 수 있기 때문에 안전하지 않다고 말했습니다. 그러나 때로는 환경 값에 의존해야합니다. 예를 들어, include_path
호출하는 스크립트의 디렉토리가 현재 작업 디렉토리 이전에도 검색 할 첫 번째 위치가되도록 공백으로 설정할 수 있습니다 . 코드는 이미 외부 소스에서 정기적으로 작성 및 업데이트되었을 수 있으며 __DIR__
코드가 업데이트 될 때마다 접두사를 다시 삽입하지 않으려 고합니다 .
dirname(__FILE__)
(__DIR__)
php> = 5.3으로 호출 스크립트의 자체 디렉토리 를 검색합니다 .)" 확실합니까? 어디에 문서화되어 있습니까? 난 당신이 잘못 바라며, PHP는 않습니다 하지 사용 __FILE__
하고 __DIR__
위해 이 목적 것과 같은 즉시에서 "형제"스크립트를 포함하여 휴식 것이 심볼릭 링크 들! : -o (다행히도 7.1 설정에서는 여기에서 잘 작동하는 것으로 보입니다.)
짧은 대답 : 포함 스크립트와 관련이 있습니다.
TFM은이를 올바르게 설명합니다.
include_path에서 파일을 찾을 수없는 경우 include는 호출 스크립트의 디렉토리와 현재 작업 디렉토리를 확인합니다.
경우에 따라서, /app/main.php는 말한다 include("./inc.php")
즉 찾을 수 /app/inc.php .
./는 꼭 필요하지 않지만의 include_path에 대한 종속성을 제거합니다.
누군가가 .NET Framework로 변경하는 경우 현재 작업 디렉토리에서 포함 파일을 찾는 데 의존하지 않습니다 chdir()
.
./
호출하는 스크립트의 디렉토리를 먼저 확인합니까 아니면 현재 작업 디렉토리를 먼저 확인합니까?
./
. 즉, chdir ( "/ app / other")는 include("./inc.php")
실패합니다. 따라서이 include("inc.php")
경우 안전을 위해 사용하십시오 .