이미 존재하는 파일에 대하여 require_once
를 사용했는데, Failed to open stream: No such file or directory
에러가 발생했다.
classes
디렉토리의 pagination.class.php
파일의
require_once '../lib/delete_parameter.php';
이 부분에서 에러가 발생한 것이다. 절대경로로 변경하니 오류는 사라지고 정상적으로 include
되었다.
이번 포스트에서는 절대경로로 include
하는 방법을 알아본다.
require, include
차이Include - PHP document
Require - PHP document
이 개념을 먼저 이해하는 것이 좋을 것 같아서 넣었다.
거의 동일한 기능을 수행한다고 볼 수 있지만, 큰 차이가 존재한다.
require is identical to include except upon failure it will also produce a fatal E_COMPILE_ERROR level error. In other words, it will halt the script whereas include only emits a warning (E_WARNING) which allows the script to continue.
위는 require
에 대한 document 설명인데, 간단히 정리하자면
바로 삽입 실패 시 에러 발생 여부이다.
include
는 경고 출력 후 스크립트를 계속 실행한다.
require
는 에러 출력 후 프로그램이 종료된다.
나는 개인적으로 require_once
를 선호한다. 중복 파일 삽입을 방지하고, 잘못된 파일을 include
하는 경우 에러가 발생해 의도치 않은 스크립트 실행도 방지할 수 있기 때문이다.
$_SERVER['DOCUMENT_ROOT']
$_SERVER — Server and execution environment information
서버 및 실행 환경 정보를 저장하고 있는 변수이다.
이곳에 DOCUMENT_ROOT
가 존재하는데, 이에 대한 설명은 다음과 같다.
The document root directory under which the current script is executing, as defined in the server's configuration file.
서버 구성 파일에 정의된 루트 디렉토리라고 할 수 있다.
해당 값을 확인하기 위해 var_dump()
를 사용해서 출력해보았다.
var_dump($_SERVER['DOCUMENT_ROOT']);
string(43) "C:/Bitnami/wampstack-8.0.9-0/apache2/htdocs"
서버의 루트 디렉토리는 서버 구성 파일에서 변경 가능한데, Bitnami - WAMP
Stack 기준으로 C:\Bitnami\wampstack-(버전명)\apache2\conf\bitnami
에 존재하는 bitnami.conf
에서 변경 가능하다.
...
<VirtualHost _default_:80>
DocumentRoot "C:/Bitnami/wampstack-(버전명)/apache2/htdocs"
<Directory "C:/Bitnami/wampstack-(버전명)/apache2/htdocs">
...
여기서 DocumentRoot
부분과 Directory
부분의 경로를 수정하면 된다.
이제 절대경로를 이용하여 파일을 삽입해보자.
절대경로는 상대경로와 다르게 최상위 root directory
부터 경로를 작성하는 것이다.
상대 경로 기준이 현재 파일 이라면 절대 경로 기준은 루트 폴더다.
절대경로의 기준은 서버의 루트폴더가 아니다.
파일이 C드라이브에 있는 경우 C드라이브부터 작성해야 한다.
따라서 원래 절대경로로 삽입을 하면
require_once 'C:/Bitnami/wampstack-(버전명)/apache2/htdocs/lib/delete_parameter.php';
이렇게 복잡하고 불필요한 정보가 들어가있다.
이때, 루트 디렉토리를 명확하게 표현하고 간결하게 삽입하기 위해 $_SERVER['DOCUMENT_ROOT']
를 사용하는 것이다.
이것을 사용하면 나머지 경로를 서버의 루트 폴더 기준으로 작성하면 된다.
require_once $_SERVER['DOCUMENT_ROOT'].'/lib/delete_parameter.php';
여기서 나머지 경로는 /lib/delete_parameter.php
를 말하는 것이다.
위의 주의와 헷갈릴 수 있는데, C:/~~
이렇게 C드라이브부터 작성하던 것을 $_SERVER['DOCUMENT_ROOT']
를 사용하여 C드라이브부터 서버의 루트 디렉토리까지 작성이 되므로 나머지 경로(/lib/delete_parameter.php
)를 서버의 루트 디렉토리 기준으로 작성한다고 볼 수 있다.
코드도 더 간결해지고 파일의 위치도 쉽게 파악이 가능하다.