[WEB] PHP require / include & 절대경로

이미 존재하는 파일에 대하여 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 - PHP document

$_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)서버의 루트 디렉토리 기준으로 작성한다고 볼 수 있다.

코드도 더 간결해지고 파일의 위치도 쉽게 파악이 가능하다.


참고

include, require 정리


게시판 프로젝트 URL

Github - Profile-exe/CRUDboardsite

좋은 웹페이지 즐겨찾기