PHP 개발 중에 포함 _Path는 파일의 경로를 설정하는 데 종종 사용되는 중요한 구성입니다. get_include_path () 및 set_include_path () 를 통해 PHP가 파일을 포함하는 위치를 유연하게 제어 할 수 있습니다. 그러나이 두 기능을 사용할 때 많은 개발자들이 혼란스러운 문제를 겪습니다. 경로가 설정되었지만 파일을 찾을 수 없다는 프롬프트가 포함되거나 포함되어야합니다 . 이게 왜?
예를 들어, 코드는 다음과 같습니다.
set_include_path('/var/www/html/libs');
include 'myLibrary.php';
/var/www/html/libs/mylibrary.php가 존재하는지 확인하지만 실행할 때 다음과 같은 오류가 발생합니다.
Warning: include(myLibrary.php): failed to open stream: No such file or directory
이 시점에서 경로 설정을 확인합니다.
echo get_include_path();
출력은 다음과 같습니다.
/var/www/html/libs
그것은 경로가 실제로 올바르게 설정되었음을 의미하지만 파일을 아직 찾을 수없는 이유는 무엇입니까?
설정 후 set_include_path ()가 작동하지 않는 몇 가지 일반적인 이유가 있습니다.
설정 후 어딘가에 실수로 덮어 쓰는 경우 include_path (예 :).
set_include_path('/var/www/html/libs');
// 다른 코드...
set_include_path('.');
후속 설정은 이전 경로를 덮어 씁니다. 따라서 이전에 설정된 경로는 작동하지 않습니다.
해결책 :
경로를 추가 할 때 Path_Separator를 사용하여 원래 경로를 연결하십시오.
set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/html/libs');
경로가 올바르게 설정 되더라도 PHP에 디렉토리 또는 파일에 액세스 할 수있는 권한이 없으면 실패를 포함합니다.
해결책 :
대상 디렉토리 및 파일의 권한이 PHP 사용자 (일반적으로 www-data 또는 apache)에게 읽을 수 있는지 확인하십시오.
chmod -R 755 /var/www/html/libs
일부 서버 구성에서 Open_Basedir는 PHP가 특정 디렉토리 만 액세스하도록 제한 할 수 있으며, 이로 인해 다른 경로의 파일이 포함 된 경우에도 액세스 할 수 없게됩니다.
해결책 :
php.ini 에서 Open_basedir 구성 항목을 확인하십시오.
open_basedir = /var/www/html/:/tmp/
설정 /var/www/html/libs를 포함하는 포함 경로가 허용 범위에 포함되어 있는지 확인해야합니다.
이것은 무시하기 가장 기본적이지만 가장 쉬운 문제입니다. 예를 들어, 파일 이름 케이스 오류, 경로 철자법 등이 잘못되었습니다. Linux Systems, MyLibrary.php 및 MyLibrary.php 는 두 개의 다른 파일입니다.
/var/www/html/libs/functions.php 에있는 파일을 포함시키고 싶다고 가정하고 코드는 /var/www/html/public/index.php 에 있다고 가정 해 봅시다.
set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/html/libs');
include 'functions.php';
더 나은 접근 방식은 배포 경로가 변경 될 때 문제를 피하기 위해 __dir__ 와 함께 상대 경로를 사용하는 것입니다.
set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ . '/../libs');
include 'functions.php';
또는 spl_autoload_register ()를 사용하여 클래스 파일의 자동로드를 균일하게 관리합니다.
spl_autoload_register(function ($class) {
include $class . '.php';
});
set_include_path () 로 검색 디렉토리를 설정하십시오.
set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/html/libs');
PHP가 원하는 경로를 확인하려면 오류가 발생하면 get_include_path ()를 인쇄하고 Stream_Resolve_Include_Path ()를 사용하여 실제 검색 결과를 볼 수 있습니다.
echo stream_resolve_include_path('functions.php');
이를 통해 경로가 설정되지 않았는지 또는 파일 자체가 존재하지 않는지 신속하게 결정하는 데 도움이 될 수 있습니다.
include_path 설정은 작동하지 않으며, 경로 덮어 쓰기, 불충분 한 권한, 구성 제한 또는 철자 오류와 같은 문제로 인해 발생합니다. 이러한 유형의 문제를 해결하는 데는 다음과 같습니다.
get_include_path () + path_separator를 사용하여 덮어 쓰기 대신 경로를 추가하십시오.
대상 파일 경로가 정확하고 권한을 읽을 수 있는지 확인하십시오.
서버 구성에 액세스 경로가 제한되어 있는지 확인하십시오.
진단을 돕기 위해 Stream_Resolve_include_path () 와 같은 디버깅 기능을 사용하십시오.
이러한 기술을 마스터 한 후에는 포함 _Path를 더 잘 활용하여 코드의 모듈성 및 유지 관리 가능성을 향상시켜 PHP 프로젝트 구조를보다 명확하고 유연하게 만듭니다.
더 많은 예 또는 자원 관리 모범 사례를 보려면 https://gitbox.net/php-resources를 방문하십시오.