PHP는 파일이나 호출 코드에 상대적인 경로를 포함합니까?


111

PHP 상대 포함 경로와 관련된 규칙 세트를 이해하는 데 문제가 있습니다. 파일 A.PHP-를 실행하고 파일 A.PHP에 파일 C.PHP를 포함하는 파일 B.PHP가 포함되어있는 경우 C.PHP의 상대 경로가 B.PHP의 위치 또는 A의 위치와 관련이 있어야합니다. .PHP? 즉, include가 어떤 파일 에서 호출되었는지, 아니면 현재 작업 디렉토리가 무엇이며 현재 작업 디렉토리를 결정하는 것이 중요합니까?


내 의견으로는 받아 들인 대답보다 더 정확합니다 : stackoverflow.com/a/23902890/1636522 .

답변:


132

기본 스크립트 (이 경우 A.php)에 상대적입니다. 그 기억 include()은 현재 실행중인 스크립트에 바로 삽입 코드를.

즉, include가 호출되는 파일이 중요합니까?

아니.

당신이하려는 경우 확인 문제를, 그리고는 B.php를 기준으로 포함 할, 사용 __FILE__상수 (또는 __DIR__PHP 5.2 IIRC부터) 리터럴 현재 파일에 항상 점 코드의 라인에 위치하는 것이다.

include(dirname(__FILE__)."/C.PHP");

@ Pekka- 굉장-내가 찾던 것. 자세한 내용은 stackoverflow.com/questions/2184810/…을
Yarin 2011 년

7
__DIR__정확한 목적으로 사용할 수도 있습니다 .
Nick Bedford

1
이 대답은 다소 지나치다 : NO NEED include(dirname(__FILE__)."/C.PHP");, 왜냐하면 include("C.PHP");충분 하기 때문 입니다 (예! C.PHP는 B.PHP와 동일한 디렉토리에있을 수 있습니다). 프로젝트에 두 개의 C.PHP 파일이있을 때만 실패 할 수 있습니다.
Johnny Wong

더 명확하게하기 위해 : 포함 경로에 "./"또는 "../"접두사가없는 경우 B.php 및 A.php 둘 다에 상대적입니다. 아래 내 대답을 참조하십시오.
Johnny Wong

21

@Pekka가 저를 데려 왔지만 제가 배운 것을 공유하고 싶습니다.

getcwd() 실행을 시작한 파일이있는 디렉토리를 반환합니다.

dirname(__FILE__) 현재 실행중인 코드를 포함하는 파일의 디렉토리를 반환합니다.

이 두 가지 함수를 사용하면 항상 필요한 항목과 관련된 포함 경로를 만들 수 있습니다.

예를 들어 b.php와 c.php가 디렉토리를 공유하는 경우 b.php는 다음과 같이 c.php를 포함 할 수 있습니다.

include(dirname(__FILE__).'/c.php');

b.php가 어디에서 호출 되든 상관 없습니다.

실제로 이것은 추가 코드가 대상 파일을 찾으려고 할 때 include_path를 반복 할 필요가 없도록 PHP를 해제하기 때문에 상대 경로를 설정하는 선호되는 방법입니다.

출처 :

getcwd ()와 dirname (__ FILE__)의 차이점은 무엇입니까? 어느 것을 사용해야합니까?

dirname (__ FILE__)을 사용해야하는 이유


뭔가를 추가하고 싶습니다. csb.php라는 파일이 있고 폴더의 함수 파일이 포함되어 있으며 함수 파일에는 함수 파일과 동일한 폴더에서 t.php라는 파일이 포함되어 있습니다. t.php 폴더에서 csb.php라는 파일은 함수 파일을 호출 한 동일한 csb.php를 포함하기 시작했지만 두 번째 csb.php를 csbe.php로 변경했을 때 즉시 작동하기 시작했습니다. 따라서 첫 번째 폴더, 두 번째 포함 폴더의 우선 순위를 정하는 것처럼 보입니다!
Miguel Vieira

18
  1. 포함 경로가 ./또는로 시작하지 않는 경우 ../, 예 :

    include 'C.php'; // precedence: include_path (which include '.' at first),
                     // then path of current `.php` file (i.e. `B.php`), then `.`.
  2. 포함 경로가 ./또는 로 시작하는 경우 ../, 예 :

    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().)


결론적으로 A.php의 경로는 먼저 C.php를 검색 한 다음 포함에 접두사 './'또는 '../'가 없으면 B.php의 경로를 검색합니다. (기본 PHP 설정 가정)
Johnny Wong

chdir(__DIR__)문제를 해결하는 데 사용 하도록 도와 주셔서 감사합니다 .
HartleySan 2016 년

[...] getcwd(), 기본값은 .php 파일 [...]의 경로입니다 . 반드시 사실은 아닙니다. 명령 줄에서 PHP를 실행하면 호출 getcwd()하는 .php파일에 관계없이 쉘의 현재 작업 디렉토리 를 참조합니다 . 하지만 PHP가 웹 서버 환경에서 실행되는 경우 환경이 현재 작업 디렉토리를 항목 .php파일 로 초기화한다고 상상할 수 있습니다 . Homebrew를 통해 PHP 7.2.2가 설치된 macOS에서 테스트되었습니다.
herzbube

17

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 설정에서는 여기에서 잘 작동하는 것으로 보입니다.)
Sz.

6

짧은 대답 : 포함 스크립트와 관련이 있습니다.

TFM은이를 올바르게 설명합니다.

include_path에서 파일을 찾을 수없는 경우 include는 호출 스크립트의 디렉토리와 현재 작업 디렉토리를 확인합니다.

경우에 따라서, /app/main.php는 말한다 include("./inc.php")즉 찾을 수 /app/inc.php .

./는 꼭 필요하지 않지만의 include_path에 대한 종속성을 제거합니다.

누군가가 .NET Framework로 변경하는 경우 현재 작업 디렉토리에서 포함 파일을 찾는 데 의존하지 않습니다 chdir().


따라서 문자열을로 시작하면 ./호출하는 스크립트의 디렉토리를 먼저 확인합니까 아니면 현재 작업 디렉토리를 먼저 확인합니까?
Pacerier

2
@Denis Howe 아니요, 포함 경로가 ./. 즉, chdir ( "/ app / other")는 include("./inc.php")실패합니다. 따라서이 include("inc.php")경우 안전을 위해 사용하십시오 .
Johnny Wong

@Pacerier 문자열이 ./ 또는 ../로 시작하면 현재 작업 디렉토리 만 확인합니다. (include_path 및 호출 스크립트 (B.php)의 디렉토리는 모두 무시됩니다). 자세한 내용은 내 대답을 참조하십시오.
Johnny Wong

-2
dir
-> a.php
-> c.php

- dir2 
-> b.php

포함하기 ab당신이 필요include("../a.php");

포함하기 bc당신이 필요include("dir2/b.php");


4
@ Olli- 당신은 질문의 요점을 놓치고 있습니다-포함이 연결될 때 상대 경로가 어떻게 결정되는지 묻습니다.
Yarin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.