대규모 PHP 프로젝트에서는 파일의 자동로드 및 경로 구성을 포함하는 것이 일반적인 디버깅 통증 지점입니다. 특히 포함 , 요구 , spl_autoload_register 또는 프레임 워크의 자동 로더를 사용하는 경우 클래스 또는 파일로드 실패에 직면하면 경로 문제를 해결하는 것이 매우 어려울 수 있습니다. 다행히도 PHP는 내장 기능 get_include_path ()를 제공하여 이러한 문제를 진단하고 디버깅 할 수 있습니다.
포함 _Path 는 PHP의 구성 항목으로, 호출 하거나 함수를 포함 할 때 지정한 파일을 찾는 디렉토리를 정의합니다. 이 경로는 php.ini 파일을 통해 설정하거나 런타임에 set_include_path () 에 의해 동적으로 수정 될 수 있습니다.
예를 들어 전화 할 때 :
include 'myclass.php';
PHP는 myclass.php가 include_path 로 구성된 디렉토리 주문 순서대로 존재하는지 확인합니다.
일반적인 이유는 다음과 같습니다.
include_path에는 대상 파일이있는 디렉토리가 포함되어 있지 않습니다.
당신은 파일이 특정 경로에 있다고 잘못 생각하지만 그렇지 않습니다.
프로젝트에는 여러 자동 로더가 사용되며 검색 전략은 다릅니다.
일부 프레임 워크 또는 라이브러리는 런타임시 포함 _Path를 동적으로 수정하여 후속 로딩 동작에 영향을 미칩니다.
현재 get_include_path ()를 사용하면 현재 검색 경로를 직관적으로 볼 수 있습니다.
적절한 위치에 다음 코드를 삽입하면 (예 : 파일이로드되기 전) :
echo get_include_path();
출력은 다음과 유사 할 수 있습니다.
.:/var/www/html/lib:/usr/share/php
이 결과는 PHP가 현재 디렉토리 ( . ), /var/www/html/lib 및 /usr/share/php 에 포함시킬 파일을 검색 할 것임을 나타냅니다.
결과를 조금 더 명확하게 포맷 할 수도 있습니다.
$paths = explode(PATH_SEPARATOR, get_include_path());
foreach ($paths as $index => $path) {
echo "[$index] $path" . PHP_EOL;
}
[0] .
[1] /var/www/html/lib
[2] /usr/share/php
이런 식으로, 당신은 하나씩 문제를 해결할 수 있습니다 :이 경로에서 기대하는 디렉토리가 있습니까? 잘못된 경로 순서에 문제가 있습니까?
테스트를 위해 코드의 경로를 일시적으로 조정할 수 있습니다.
set_include_path(get_include_path() . PATH_SEPARATOR . '/home/user/my-lib');
또는 기존 경로를 완전히 교체하십시오.
set_include_path('/home/user/my-lib');
참고 : include_path를 수정하는 것은 글로벌이며 다른 코드의 동작에 영향을 줄 수 있습니다. 디버깅 후 복원하거나 조심스럽게 사용하는 것이 좋습니다.
PHP는 또한 stream_resolve_include_path ()를 제공하며, 현재 include_path에서 파일 이름이 어떤 실제 경로를 해결할 것인지 직접 알 수 있습니다. 예를 들어:
$file = 'MyLibrary/Helper.php';
$resolved = stream_resolve_include_path($file);
if ($resolved !== false) {
echo "Found at: $resolved";
} else {
echo "File not found in include_path.";
}
이 기능은 특히 자동 로더에 클래스가 올바르게로드되지 않은 이유에 대한 문제를 디버깅하는 데 적합합니다.
get_include_path ()는 PHP 파일로드의 논리를 정렬하는 데 도움이되는 간단하지만 강력한 도구입니다. 찾을 수 없거나 클래스 정의되지 않은 파일과 같은 문제에서는 contact_path 의 구성 및 실제 내용을 가능한 빨리 확인하면 종종 문제 해결 범위가 빠르게 좁아 질 수 있습니다. set_include_path () 및 stream_resolve_include_path () 를 결합하면 유연한 디버깅 솔루션을 구축 할 수 있습니다.
다른 환경에 배포 할 때 또는 여러 타사 라이브러리를 사용하는 것과 같은 실제 프로젝트에서는 초기화 단계에서 현재 포함 _Path를 인쇄하고 기록하는 것이 좋습니다.
error_log("Current include_path: " . get_include_path());
gitbox.net 에 배포 된 프로젝트를 디버깅하는 경우 브라우저에서 진단 스크립트에 액세스 할 수 있습니다.
// https://gitbox.net/debug/include_path.php
echo nl2br(get_include_path());
이를 통해 서버의 실제 경로 구성을 직관적으로 볼 수 있으므로 원격 디버깅에 큰 편의를 제공합니다.