절대 경로가 필요한 PHP 파일을 포함하는 방법은 무엇입니까?


95

다음과 같은 디렉토리 구조가 있습니다.

script.php

inc / include1.php
inc / include2.php

objects / object1.php
objects / object2.php

soap / soap.php

이제이 객체를 script.php및 에서 모두 사용 하고 /soap/soap.php이동할 수 있지만 특정 이유로 이와 같은 디렉토리 구조를 원합니다. 실행할 때 script.php경로가 포함 inc/include.php하고 실행할 때 /soap/soap.php그건 ../inc절대 경로 작업, /mnt/webdev/[project name]/inc/include1.php...하지만 내가 다른 위치로 디렉토리를 이동할 경우는 추한 솔루션입니다.

따라서 상대 경로를 사용하는 방법이나 프로그래밍 방식으로 "/mnt/webdev/[project name]/"?

답변:


149

이것은 작동합니다

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

편집 : aussieviking에 의해 개선 사항 추가


2
주의하십시오. 이것은 채워지는 웹 서버를 통해 스크립트를 실행하는 경우에만 작동합니다DOCUMENT_ROOT
Phil

질문입니다. 왜 $ _SERVER [ "DOCUMENT_ROOT"]에 대한 realpath ()입니까? 이것은 항상 표준 경로를 출력하지 않습니까?
João Pimentel Ferreira 2015

44

상대 경로를 사용할 수 있습니다. 시도해보십시오 __FILE__. 이것은 항상 스크립트의 경로 / 파일 이름을 반환하는 PHP 상수입니다. 따라서에서 soap.php다음을 수행 할 수 있습니다.

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

파일의 전체 경로 및 파일 이름입니다. 포함 내에서 사용하면 포함 된 파일의 이름이 반환됩니다. PHP 4.0.2부터는 __FILE__항상 심볼릭 링크가 해결 된 절대 경로를 포함하지만 이전 버전에서는 일부 상황에서 상대 경로를 포함했습니다. (출처)

또 다른 해결책은 httpd.conf 또는 .htaccess 파일에 포함 경로 를 설정하는 것 입니다.


8
난 당신이를 추가해야한다고 생각 /을 분리, 인용 된 표현의 시작 부분 ..으로부터 파일 이름입니다.
Dunaril 2011-08-08

9
PHP 5.3.0부터는 .NET Framework를 사용하는 __DIR__대신 매직 상수 를 사용할 수 있습니다 dirname(__FILE__). (PHP 문서)
Erwin Wessels

3
include dirname(__FILE__).'/../inc/include.php';상대 경로 앞의 "/"를 잊지 마십시오.
스티븐 Leimberg

6

포함 할 필요가 전혀없는이를 처리하는 또 다른 방법은 자동로드 기능 을 사용하는 것 입니다. 스크립트에 "Just in Case"에 필요한 모든 것을 포함하면 성능이 저하 될 수 있습니다. 포함이 모든 클래스 또는 인터페이스 정의이고 필요할 때만로드하려는 경우 __autoload()자체 코드로 함수를 오버로드 하여 적절한 클래스 파일을 찾고 호출 될 때만로드 할 수 있습니다. 다음은 매뉴얼의 예입니다.

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

이에 따라 include_path 변수를 설정하는 한 클래스 파일을 다시 포함 할 필요가 없습니다.



5

프로젝트의 루트 디렉토리 경로로 상수를 정의한 다음 경로의 시작 부분에 넣을 수 있습니다.


2

Kevin과 관련된 또 다른 옵션은 use입니다 __FILE__. 대신 내부에서 php 파일 이름을 바꿉니다.

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

나는 이것을 한동안 사용하고 있습니다. 유일한 문제는 때로는 가지고 있지 $_SERVER['SCRIPT_NAME']않지만 때로는 비슷한 다른 변수가 있다는 것입니다.


2

나는 이것이 매우 잘 작동한다는 것을 알았습니다!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

사용하다:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>

1

가장 좋은 방법은 포함을 PHP 포함 경로에 넣는 것입니다. 설정에 따라이를 수행하는 다양한 방법이 있습니다.

그런 다음 간단히 참조 할 수 있습니다.

require_once 'inc1.php';

포함 여부, 웹 액세스 가능 파일 또는 중첩 된 하위 디렉터리 수준에 관계없이 모든 파일 내부에서.

이를 통해 웹 서버 루트 외부에 포함 파일을 가질 수 있으며 이는 모범 사례입니다.

예 :

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

또한 __autoload에서 클래스 파일의 지연로드를 확인하십시오.

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload


1
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

이 코드 줄을 사용합니다. 사이트 트리의 "맨 위"로 돌아가서 원하는 파일로 이동합니다.

예를 들어 다음과 같은 파일 트리가 있다고 가정 해 보겠습니다.

domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php

복사하여 붙여 넣기 만하면 어디에 있든 functions.php 파일을 포함 할 수 있습니다.

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

이 코드를 여러 번 사용해야하는 경우 str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))부분 을 반환하는 함수를 만들 수 있습니다 . 그런 다음 포함하는 첫 번째 파일에이 함수를 삽입하십시오. 각 PHP 페이지의 맨 위에 포함하고이 함수를 포함하는 "initialize.php"파일이 있습니다. 다음에 파일을 포함해야 할 때 실제로 (이름이 지정된 path_back) 함수를 사용합니다 .

require(path_back()."/_resources/another_php_file.php");

0

@Flubba, 내 include 디렉토리 안에 폴더를 가질 수 있습니까? 플랫 포함 디렉토리는 나에게 악몽을 준다. 전체 개체 디렉터리는 inc 디렉터리에 있어야합니다.

아, 물론입니다. 예를 들어, 일반적으로 다음과 같은 단일 하위 폴더 레이어를 사용합니다.

require_once('library/string.class.php')

파일이 있는지 확인하기 위해 PHP가 현재 디렉토리와 include 경로의 모든 디렉토리를 검색해야하기 때문에 트래픽이 매우 많은 사이트에서는 포함 경로에 너무 많이 의존하는 데주의해야합니다. 당신이 망치면 일이 일어납니다.

예를 들어 MVC를 수행하는 경우 포함 경로에 애플리케이션 디렉토리 경로를 입력 한 다음 다음 형식으로 참조 참조를 지정합니다.

'model/user.class'
'controllers/front.php'

또는 무엇이든.

그러나 일반적으로 말하면 어디에서나 작동하는 PHP의 매우 짧은 경로로 작업 할 수 있으며 모든 실제 경로 문서 루트 malarkey보다 훨씬 읽기 쉽습니다.

다른 사람들이 제안한 스크립트 기반 대안의 이점은 공유 된 상자에서도 어디서나 작동한다는 것입니다. include 경로를 설정하려면 좀 더 많은 생각과 노력이 필요하지만 앞서 언급했듯이 가장 멋진 __autoload를 사용할 수 있습니다.


0

애플리케이션의 대부분의 파일에 특정 경로를 포함하려면 루트 폴더에 전역 변수를 만듭니다.

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

이제이 전역 변수 " APPLICATION_PATH "를 사용하여 새 파일을 포함 할 때마다 realpath ()를 호출하는 대신 모든 파일을 포함 할 수 있습니다.

전의:

include(APPLICATION_PATH ."/config/config.ini";

도움이 되었기를 바랍니다 ;-)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.