문제
다음과 같은 디렉토리 구조가 있습니다.
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를 확인하세요.
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";
도움이 되길 바랍니다 ;-)