require_once의 상대 경로가 작동하지 않습니다.


103

나는 다음과 같은 구조를 가지고 있습니다.

otsg
 > class
   > authentication.php
   > database.php
   > user.php
 > include
   > config.inc.php
   > encryption.php
   > include.php
   > session.php
 > index.php
 > registration.php

include.php 파일은 다음과 같습니다.

ini_set('display_errors', 1);
error_reporting(E_ALL);

ini_set('include_path',ini_get('include_path').':/Applications/MAMP/htdocs/otsg/:');
require_once 'config.inc.php';
require_once '../class/database.php';
require_once '../class/user.php';
require_once 'encryption.php';
require_once 'session.php';
require_once '../class/authentication.php';

그리고 index.php 페이지에 내가 포함시킨

require_once 'include/include.php';

index.php 페이지를 열면 다음과 같은 경고와 치명적인 오류가 발생합니다. 이 오류의 원인을 이해할 수 없습니다. 내가 절대 경로를 주면 작동합니다. 그러나 절대 경로는 내가 믿는 좋은 생각이 아닙니다.

Warning: require_once(../class/database.php) [function.require-once]: failed to open stream: No such file or directory in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

Fatal error: require_once() [function.require]: Failed opening required '../class/database.php' (include_path='.:/Applications/MAMP/bin/php5.3/lib/php:/Applications/MAMP/htdocs/otsg/include/:') in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

미리 감사드립니다


저는 보통 Objective-C를 수행하고 PHP 스크립팅에 손을 대려고 노력하고 있으며 PHP에 파일을 올바르게 포함하는 방법을 알아내는 데 이미 2 시간을 낭비한 것을보고 슬픕니다. X 코드를 사용하면 일이 너무 쉽습니다.
rohan-patel 2014-06-18

이 오류가 자주 발생하고 신속하게 문제를 해결하려면 다음 단계를 따르십시오. stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

답변:


216

사용하다

__DIR__

스크립트의 현재 경로를 가져 오면 문제가 해결됩니다.

그래서:

require_once(__DIR__.'/../class/user.php');

이렇게하면 다른 폴더에서 PHP 스크립트를 실행할 수 있으므로 상대 경로가 작동하지 않는 경우를 방지 할 수 있습니다.

편집 : 슬래시 문제 수정


42
조심해! __DIR__PHP 5.3의 새로운 기능입니다. 이 스크립트를 이전 버전의 PHP에서 실행하려면 dirname(__FILE__)대신 사용해야 합니다.
Charles

27
뒤에 슬래시를 수동으로 포함해야합니다 __DIR__. 그래서 : require_once(__DIR__.'/../class/user.php');문서 , 후행 슬래시는 루트 디렉토리를 제외하고 생략하기로한다.
Ariel Allon

9
도움을 주셔서 감사합니다.하지만 여전히 왜 __DIR__필요한지 모르겠습니다 . PHP 문서는 PHP가 기본적으로 현재 스크립트의 디렉토리를 검색한다고 말하는 것 같습니다. 누구든지 빛을 비출 수 있습니까?
David

1
@David 두 곳에서 동시에 파일을 가져올 때 이것이 필요하다고 생각합니다. 예를 들어 require "../a.php". 이 파일을 다른 파일 (x)에서 가져 오면 dir1/dir2/x.php포함 된 파일의은 dir1/a.php이지만 x가에 있으면 dir1/dir2/dir3/x.php포함 된 파일은 dir1/dir2/a.php등 이됩니다 . 아니면 내가 잘못 되었습니까?
José Ramón 2014

1
이제이 빈번한 오류에 대한 문제 해결 체크리스트가 있습니다. stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

17

PHP 버전 5.2.17의 __DIR__경우 작동하지 않습니다 .PHP 5.3에서만 작동합니다.

그러나 이전 버전의 PHP의 경우 dirname(__FILE__)완벽하게

예를 들어 다음과 같이 작성하십시오.

require_once dirname(__FILE__) . '/db_config.php';

1

내 경우에는 그와 함께도하지 작업을 수행 __DIR__하거나 getcwd()이 잘못된 경로를 따기 유지, 나는이 프로젝트의 절대 기본 경로에 필요한 모든 파일에 costant을 정의하여 해결 :

if(!defined('THISBASEPATH')){ define('THISBASEPATH', '/mypath/'); }
require_once THISBASEPATH.'cache/crud.php';
/*every other require_once you need*/

PHP 5.4.10으로 MAMP가 있고 폴더 계층 구조는 기본입니다.

q.php 
w.php 
e.php 
r.php 
cache/a.php 
cache/b.php 
setting/a.php 
setting/b.php

....


0

나는 방금이 동일한 문제를 만났는데, 다른 포함에 포함이있을 때까지 모두 잘 작동했습니다.

require_once '../script/pdocrud.php';  //This worked fine up until I had an includes within another includes, then I got this error:
Fatal error: require_once() [function.require]: Failed opening required '../script/pdocrud.php' (include_path='.:/opt/php52/lib/php')

해결 방법 1. (내 공개 html 폴더 이름의 하드 코딩이 원하지 않지만 작동 함) :

require_once $_SERVER["DOCUMENT_ROOT"] . '/orders.simplystyles.com/script/pdocrud.php';

솔루션 2. (DIR에 대한 위의 원하지 않는 주석은 php 5.3 이후로만 작동하지만 작동합니다) :

require_once __DIR__. '/../script/pdocrud.php';

솔루션 3. (저는 단점을 볼 수 없으며 내 PHP 5.3에서 완벽하게 작동합니다) :

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