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

StackOverflow https://stackoverflow.com/questions/4369

  •  08-06-2019
  •  | 
  •  

문제

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

script.php

inc/include1.php
inc/include2.php

객체/object1.php
객체/object2.php

비누/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]/"?

도움이 되었습니까?

해결책

이것은 작동합니다

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

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

편집하다: 개선 사항을 추가했습니다. 호주 바이킹

다른 팁

상대 경로를 사용할 수 있습니다.노력하다 __FILE__.이는 항상 해당 스크립트의 경로/파일 이름을 반환하는 PHP 상수입니다.그래서, soap.php, 당신은 할 수 있습니다 :

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

파일의 전체 경로와 파일 이름.포함 내부에서 사용되면 포함 된 파일의 이름이 반환됩니다.PHP 4.0.2부터, __FILE__ Symlinks가 해결 된 절대 경로가 항상 포함되어 있으며 이전 버전에는 일부 상황에서 상대 경로가 포함되어 있습니다. (원천)

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

좀 봐 http://au.php.net/reserved.variables

당신이 찾고있는 변수는 다음과 같습니다 $_SERVER["DOCUMENT_ROOT"]

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

포함이 전혀 필요하지 않게 처리하는 또 다른 방법은 다음을 사용하는 것입니다. 자동 로드 특징."만약의 경우"에 필요한 모든 것을 스크립트에 포함하면 성능이 저하될 수 있습니다.포함 항목이 모두 클래스 또는 인터페이스 정의이고 필요할 때만 로드하려는 경우 __autoload() 자신만의 코드로 함수를 사용하여 적절한 클래스 파일을 찾고 호출될 때만 로드하세요.다음은 매뉴얼의 예입니다.

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

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

include_path 변수를 적절하게 설정하면 클래스 파일을 다시 포함할 필요가 없습니다.

Kevin's와 관련된 또 다른 옵션은 다음과 같습니다. __FILE__, 대신 그 안에 있는 PHP 파일 이름을 바꾸세요.

<?php

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

?>

나는 이것을 한동안 사용해 왔습니다.유일한 문제는 때로는 $_SERVER['SCRIPT_NAME'], 그러나 때로는 유사한 또 다른 변수가 있습니다.

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

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');

?>

내 생각에 가장 좋은 방법은 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=__자동로드

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

내가 어디에 있든 복사하여 붙여넣기만 하면 function.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");

@Flubba, 이렇게 하면 내 포함 디렉터리 안에 폴더를 가질 수 있나요?플랫 포함 디렉토리는 나에게 악몽을 안겨준다.전체 개체 디렉터리는 inc 디렉터리에 있어야 하기 때문입니다.

아, 물론이죠.예를 들어 일반적으로 단일 하위 폴더 계층을 사용합니다.

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

트래픽이 매우 많은 사이트에서는 포함 경로에 너무 많이 의존하지 않도록 주의해야 합니다. 왜냐하면 PHP는 파일이 있는지 확인하기 위해 현재 디렉터리와 포함 경로의 모든 디렉터리를 검색해야 하고 이로 인해 속도가 느려질 수 있기 때문입니다. 망치질을 당하면 문제가 해결됩니다.

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

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

또는 무엇이든.

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

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

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

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

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

전:

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

도움이 되길 바랍니다 ;-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top