PHP에서 DISK_TOTAL_SPACE () 함수는 파일 시스템 또는 디스크 파티션의 총 공간 크기를 얻는 데 사용될 수 있습니다. 이 기능은 서버 모니터링, 공간 경고 및 기타 기능을 수행 할 때 매우 유용합니다. 그러나 실제로 사용하면 일부 개발자는이 문제에 직면합니다. 코드는 구문 오류가 분명히 없지만 DISK_TOTAL_SPACE ()를 호출 할 때는 경고를하고 심지어 "허가 거부"또는 유사한 권한 관련 오류가 발생합니다.
그렇다면이 권한 문제는 어떻게 발생 했습니까? 문제 해결 및 해결 방법은 무엇입니까? 이 기사는이 문제의 가능한 원인을 단계별로 분석하고 실용적인 솔루션을 제공합니다.
일반적으로 다음 코드를 작성했을 수 있습니다.
<span><span><span class="hljs-variable">$disk</span></span><span> = </span><span><span class="hljs-string">'/var/www/'</span></span><span>;
</span><span><span class="hljs-variable">$space</span></span><span> = </span><span><span class="hljs-title function_ invoke__">disk_total_space</span></span><span>(</span><span><span class="hljs-variable">$disk</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$space</span></span><span>);
</span></span>이상적으로는 경로가있는 파일 시스템의 총 바이트 수를 나타내는 정수를 반환해야합니다. 그러나 실제 반환은 거짓 이며 때로는 다음 경고 메시지와 함께합니다.
<span><span>Warning: </span><span><span class="hljs-built_in">disk_total_space</span></span><span>(): open_basedir restriction in effect. </span><span><span class="hljs-built_in">File</span></span><span>(/var/www/) is not within the allowed </span><span><span class="hljs-built_in">path</span></span><span>(s): ...
</span></span>또는:
<span><span><span class="hljs-built_in">Warning</span></span><span>: disk_total_space(): failed </span><span><span class="hljs-keyword">to</span></span><span> </span><span><span class="hljs-keyword">open</span></span><span> dir: Permission denied
</span></span>이것은 가장 기본적인 질문입니다. disk_total_space ()에는 기존의 유효한 디렉토리 경로가 필요합니다. 통과하는 경로가 존재하지 않으면 기능이 자연스럽게 작동하지 않습니다.
문제 해결 방법 :
경로가 존재하는지 확인하려면 is_dir () 또는 file_exists ()를 사용하십시오.
경로가 특히 Linux에서는 사례 민감도에주의를 기울여야합니다.
<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$disk</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"디렉토리가 존재하지 않습니다:<span class="hljs-subst">$disk</span></span></span><span>";
}
</span></span>웹 서버 (예 : Apache 또는 Nginx)에서 PHP를 실행하는 프로세스 사용자 (예 : www-data , apache 등)는 제공 한 디렉토리에 액세스 할 수있는 권한이 없을 수 있습니다.
문제 해결 방법 :
이 경로에 대한 권한을보기 위해 ls -ld/path/to/dir를 사용하십시오.
WHOAMI 및 PS AUX |를 사용하십시오 PHP의 실행중인 사용자를 확인하기위한 GREP PHP ;
CLI 모드를 사용하여 차이가 있는지 테스트하십시오. CLI 모드는 현재 로그인 사용자 권한을 사용하며 일반적으로 더 높습니다.
디렉토리가 일반적인 제한인지 여부를 테스트 / 컨텐츠 테스트에 액세스하십시오.
해결책:
chown 또는 chmod를 사용하여 적절한 권한을 제공합니다 (보안 요구 사항으로 조정).
PHP가 액세스 권한이있는 영역에 대상 경로를 배치하십시오.
<span><span>sudo </span><span><span class="hljs-built_in">chmod</span></span><span> o+rx /var/www/
</span></span>(참고 : 보안상의 이유로 전체 디렉토리에 쓰기 권한을 여는 것을 피하기 위해 권한을 신중하게 수정하십시오).
Open_basedir 는 PHP 스크립트가 액세스 할 수있는 파일 시스템 디렉토리의 범위를 제한하는 PHP의 구성 항목입니다. 들어오는 경로 가이 범위를 벗어난 경우 DISK_TOTAL_SPACE ()가 제한됩니다.
문제 해결 방법 :
php.ini를 확인하거나 phpinfo ()를 사용하여 Open_basedir 의 값을 찾으십시오.
/home/user :/tmp 와 같은 제한된 경로가 표시되고 $ 디스크가 포함되지 않으면 오류가 트리거됩니다.
해결책:
php.ini , .htaccess 또는 php-fpm의 풀 구성을 수정하고 필요한 디렉토리를 Open_basedir 목록에 추가합니다.
가상 호스트 패널 (예 : CPANEL, PLESK)을 사용하는 경우 허용 가능한 경로를 백그라운드에서 설정해야합니다.
<span><span>php_admin_value open_basedir "/var/www/:/tmp/"
</span></span>Selinux 또는 Apparmor Enabled가있는 일부 Linux 시스템에서는 PHP가 보안 정책 제한으로 인해 특정 경로에 액세스하지 못할 수 있습니다.
문제 해결 방법 :
시스템이 활성화되어 있는지 확인하십시오 : GetEnforce 명령;
감사 로그 : /var/log/audit/audit.log 를 보거나 AUDIT2WHY 를 사용하여 분석하십시오.
ls -z를 사용하여 경로의 Selinux 컨텍스트를보십시오.
해결책:
Selinux를 일시적으로 종료합니다 (생산 환경은 권장되지 않음);
정책을 수정하거나 CHCON을 사용하여 적절한 컨텍스트를 지정합니다.
AppArmor의 경우 프로필을 수정해야합니다.
<span><span>sudo </span><span><span class="hljs-built_in">chcon</span></span><span> -t httpd_sys_content_t /var/www/ -R
</span></span>경로 검증이 선호됩니다 . 경로가 합법적이며 전화하기 전에 존재하는지 확인하십시오.
로그 추적 : PHP 오류 로그보기로 인해 문제의 소스가 빠르게 찾을 수 있습니다.
합리적인 분산 : 전체 시스템 노출을 피하기 위해 PHP가 요구하는 최소 권한을 부여하십시오.
생산 환경 격리 : 컨테이너 또는 chroot 환경에서의 액세스를 제한하는 것이 더 안전합니다.
CLI 및 웹 차이 분석 : 일부 경로는 CLI 모드에서 액세스 할 수 있고 웹 모드는 제한되어 있으므로 테스트 포지셔닝 문제를 비교할 수 있습니다.
DISK_TOTAL_SPACE () 는 작고 일반적으로 사용되는 기능이지만 파일 시스템 액세스 권한, PHP 보안 구성 및 시스템 보안 정책과 관련이 있습니다. 따라서 False를 반환하거나 오류를보고하는 경우 PHP 코드 자체에만 초점을 맞추지 말고 문제를 효율적으로 찾아서 해결하기 위해 운영 체제 권한, 웹 서비스 구성, 보안 정책 등과 같은 여러 차원에서 시작하십시오.
이 기사가 비슷한 문제를보다 침착하게 다루고 다루는 데 도움이되기를 바랍니다.