[PHP] 함수 호출 시 경로 호출 에러 발생 원인 추측 ( Failed to open stream: No such file or directory in "폴더 경로"/ Fatal error: Uncaught Error: Failed opening required "호출한 경로")
php를 이용해 홈페이지를 만들 일이 생겨서 처음으로 php를 접해보았다.
그냥 php 뉴비인 상태...
내 상황은 이렇다.
1. 프로젝트에(이하 root) api 폴더를 만들어 api를 작성함
2. view 페이지는 root에 존재한다.
3. view에서 api를 require하여 작성한 함수를 호출함
4. 파일을 찾을 수 없다고 에러가 남
이런 경우가 많아서 왜 그런지 계속 생각해봤다.
1. php는 파일을 require (또는 include)하면 require를 선언한 파일 내부에 해당 파일이 같이 컴파일? 된다.
2. 따라서 require되기 전에는 상대경로가 지금 존재하는 경로 기준으로 설정된다.
3. 하지만 해당 파일이 require된 후라면 컴파일된 파일의 기준으로 상대경로가 설정된다.
말 주변이 없어서... 이해됐으려나 모르겠다...ㅠㅠ
예를 들어 현재 프로젝트의 경로가 아래와 같다고 가정하자.
ROOT
ㄴ api
ㄴ db
> 파일3.php
> 파일2.php
> 파일3.php
ROOT/api/파일2.php
<?php
//현재 위치는 ROOT/api/파일2.php라고 가정
// ROOT/api/db/파일3.php를 호출한다.
require_once "./db/파일3.php"; // << 현재 상황에선 호출하는데 이상 없음
function 파일2_함수(){
}
ROOT/파일1.php
<?php
// ROOT/api/파일2.php 호출
require_once "./api/파일2.php";
파일2_함수();
이제 경로가 다른 파일에서 파일 2를 호출해보자.
우리가 코드만 눈에 봤을 때는 위처럼 생겼겠지만 내부적으로 보면 아래와 같지 않을까?
<?php
// require_once "./api/파일2.php";
// 위의 코드가 아래 코드 2줄로 변경되겠지
/**원래 파일2.php의 내용**/
require_once "./db/파일3.php";
function 파일2_함수(){
}
/**원래 파일2.php의 내용**/
파일2_함수();
이렇게 컴파일 된 파일1을 기준으로 보자.
"./db/파일3.php"라는 상대경로를 불러오려고하면 정상적으로 찾을 수 있을까?
정답은 역시 No!!
해결 방법 1. 상대경로 대신 절대 경로 사용
<?php
echo $_SERVER["DOCUMENT_ROOT"];
$_SERVER["DOCUMENT_ROOT"] 를 사용하면 현재 파일이 존재하는 ROOT 폴더 경로를 반환해준다.
근데 얘를 썼었는데, 작업 환경마다 $_SERVER["DOCUMENT_ROOT"]가 다르게 반환되어서 잠시 보류하고 2번째 노가다 방법을 사용 중이다....
작업환경1에서는 ROOT 경로 / ROOT 폴더명 까지 반환되는데
작업환경2에서는 ROOT 경로만 반환되어서 git에서 pull 받을 때 마다 경로를 또 바꿔줘야해서 넘 번거로웠다ㅠㅠ
이유 아시는 분 있으면 댓글 부탁드려여....
해결 방법 2. dir모드를 현재 파일 기준으로 위치를 변경해준다.
참고: https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_function&wr_id=306651&page=1867
이건 php스쿨 페이지에서 발견한건데, document root가 안먹어서 얘를 파일마다 적용해놓는 중이다ㅠㅠ 뭔 고생이람
ROOT/파일1.php
<?php
// 기준 위치를 변경
chdir(dirname(__FILE__));
// ROOT/api/파일2.php 호출
require_once "./api/파일2.php";
파일2_함수();
// 원래의 경로로 변경
chdir(dirname($_SERVER['SCRIPT_FILENAME']));
해결 방법 3. 자주 사용하는 경로를 전역 변수로 선언하기(global)
이건 php global관련해서 찾아보면 어떻게 전역변수를 지정하는지 결과가 많이 나오기에 코드는 생략!
나는 전역변수에 document_root이용해서 설정하려고하니까 작업환경마다 반환되는 것이 달라서 어떻게 할 지 고민 진행 중이다...
[PHP + AJAX] php 함수를 ajax로 호출하는 법 (0) | 2022.03.24 |
---|---|
[PHP] php 날짜 포맷 변경하기 / DB에서 조회한 날짜 기호 변경 / 많이 쓰는 시간 포맷 (0) | 2022.03.22 |
[php + javascript] php 배열 값을 javascript 변수에 담는 방법 (2) | 2022.03.02 |
[php] php에서 javascript 호출해서 페이지 이동하는 법 및 페이지 이동 함수 (0) | 2022.01.27 |
[Laravel] 라라벨 설치 후 artisan 에러 시 확인해볼 것 (0) | 2022.01.14 |