2010-02-08 2 views
15

WordPress를 비롯한 유명한 PHP 스크립트가 많이 있습니다. 'myParent.php' 대신 dirname(__FILE__).'/myParent.php'을 사용해야합니다. 현재 실행중인 스크립트의 동일한 디렉토리에 파일을 포함해야합니다.그냥 require ('myParent.php')보다 require (dirname (__ FILE __). '/'. 'myParent.php')가 더 나은 점은 무엇입니까?

그들은 똑같지 않습니까? 왜 더 많이 타이핑하는 것을 선호합니까?

감사합니다.

+4

'dirname (__ FILE __)'대신에 항상'__DIR__'을 사용하는 것이 좋습니다. – Niko

+2

\ _ \ _ DIR \ __이 (가) PHP 5.3 이후로 지원됩니다. – Lamy

답변

16

PHP는 파일의 절대 경로를 알아야합니다. dirname(__FILE__).'/myParent.php'은 이미 절대 경로이지만 은 주어진 경로를 사용하여 include_path의 절대 경로를 찾아 파일을 찾는 조회가 필요합니다. 더 나은 선택은 './myParent.php' 다음과 같습니다

하지만, 명시 적으로 모든 포함을 위해 PHP는 항상 현재 디렉토리를 확인하는 것보다 include './file'를 사용하는 것이 더 효율적입니다. PHP 파일을 검색 의 include_path을 반복하지 않기 때문이 dirname + 파일 이름을 사용

+1

절대 경로가 필요하지 않으며 포함 경로가 반드시 필요한 것은 아닙니다. "경로가 정의 된 경우 (전체 또는 상대 경로) include_path는 모두 무시됩니다." http://us2.php.net/manual/en/function.include.php –

+2

@Justin Johnson : * path *를 사용하면 설명서에 문자열에 적어도 하나 이상의'/'가 있음을 의미합니다. './foo','foo/bar','/ foo/bar'는 경로이지만'foo'는 경로가 아닙니다. 그리고 그것은'myParent.php'에도 적용됩니다. – Gumbo

+0

이'require dirname (dirname (__ FILE __))))에 대한 대안이 있습니까? "/ out/DBconnection.php"; 나는. /'또는'../../'과 같은 것을 원한다. 거기 있니? – stack

11

는 약간 빠릅니다. 속도가 중요하면 더 많은 정보를 입력하게 될 것입니다.

14

성능 향상 (대부분의 경우 사전 최적화 * 일 가능성이 높습니다) 외에도 환경의 PHP 구성에 현재 디렉토리 (.)가 포함되어 있지 않은 (매우 이상한) 시나리오로부터 보호됩니다. 경로를 포함하십시오.

* 벤치 마크 include은 상대 경로 대 비교 경로가 include_path 인 경로를 사용해야합니다. 0.0000001s, 각

결과는 파일의 수백 또는 수천을 포함하지 않는 한

include("include.php"): 8.3664200305939s 
include("./include.php"): 8.3511519432068s 

(8.3664200305939 - 8.3511519432068)/100000 = 0.000000152680874s 

100000 반복을 통해 테스트하는 것은 기껏해야 무시할 수있다.

define("MAX", 100000); 

ob_start(); 
$i = MAX; 
$_t = microtime(true); 
do { 
    include("include.php"); 
} while (--$i); 
$_t = microtime(true) - $_t; 
ob_end_clean(); 

echo "include(\"include.php\"): {$_t}s\n"; 

ob_start(); 
$i = MAX; 
$_t = microtime(true); 
do { 
    include("./include.php"); 
} while (--$i); 
$_t = microtime(true) - $_t; 
ob_end_clean(); 

테스트 PHP 버전 5.2.9와 2.16GHz 맥북 10.5.8에 실시 된 테스트 코드는 다음과에 대해

7

'도있다 (참고 추가 (7 출시 www.entropy.ch) ./file.php ').

속도가 중요하다면 include ('./ file.php')를 사용할 수 있지만 종속성 및 상대 경로 문제를 해결하려면 dirname (__ FILE __)을 사용하는 것이 좋습니다.

include('./file.php') 
정지합니다 ( 스크립트 포함) 실행 스크립트 상대 경로를 구성한다

,

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

이 광고가있는 현재 스크립트 상대 경로를 확인하는 반면합니다 (때문에 스크립트 포함).

일반적으로 dirname (__ FILE __)은 훨씬 안정적인 include를 제공하지만 './'는 성능 향상을 무시할 수 있으므로 dirname (__ FILE __)을 사용하는 것이 좋습니다.

가/편집 : 또한 위에서 수행 한 벤치 마크 만 사용할 때 참으로 빨리 include('something.php') 것보다 당신이 include_path를 산책이 없기 때문에,하지만 dirname(__FILE__) 당신이 dirname() 함수 호출 오버 헤드를 얻을 include('./something.php')을 우려 점에 유의를 만든다 include_path를 걷는 것보다 느립니다 (include_path에 많은 경로가없는 경우).

+3

또는'__DIR__' ('dirname()'호출을 저장함) – Steve

+3

네, 그렇지만'__DIR__'는'__FILE__'과'dirname()'이 둘 다 PHP 4.0.2부터 사용 가능할 때 PHP 5.3.0 이후에만 사용 가능합니다. '__DIR__'은 호출 효율은 높지만 레트로 호환은 적습니다 : / – gaborous

관련 문제