>백엔드 개발 >PHP 튜토리얼 >Session_php 예제를 사용하여 PHP에서 발생한 권한 거부 알림에 대한 솔루션

Session_php 예제를 사용하여 PHP에서 발생한 권한 거부 알림에 대한 솔루션

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB원래의
2016-05-16 20:39:01878검색

ubuntu/Debian에서 적절하게 설치된 PHP를 사용하는 경우 Session을 사용할 때 작은 확률로 이 메시지가 나타날 수 있습니다.

코드 복사 코드는 다음과 같습니다.

PHP 공지: session_start(): ps_files_cleanup_dir:
opendir(/var/lib/php5) 실패: 권한 거부됨(13)
/home/laruence/www/htdocs/index.php 22행

PHP에서는 file_handler를 Session의 저장 핸들러로 사용하면 session_start마다 Session의 Gc 프로세스가 실행될 가능성이 있기 때문입니다.

코드 복사 코드는 다음과 같습니다.

//생략
int nrdels = -1;
nrand = (int) ((float) PS(gc_divisor) * php_combined_lcg(TSRMLS_C));
If (nrand < PS(gc_probability)) {
PS(mod)->s_gc(&PS(mod_data), PS(gc_maxlifetime), &nrdels TSRMLS_CC);
}
//생략

이 경고가 나타나는 이유는 apt의 PHP에서 세션의 기본 디렉터리 /var/lib/php5의 권한이 고정 비트를 사용하여 733이기 때문입니다. 이는
코드 복사 코드는 다음과 같습니다.
drwx-wx-wt 루트 루트

일반적으로 PHP 작업자는 루트가 아닌 ID로 실행되므로 이 폴더를 열 수 있는 권한이 없습니다(그러나 쓸 수 있기 때문에 일반적인 세션 파일 읽기에는 영향을 미치지 않습니다). 따라서 s_gc의 다음 코드는 다음에 언급된 알림을 트리거합니다. 시작:
코드 복사 코드는 다음과 같습니다.

//파일 처리기의 경우 s_gc는 ps_files_cleanup_dir을 간접적으로 호출합니다.
dir = opendir(dirname);
만약 (!dir) {
​​​​ php_error_docref(NULL TSRMLS_CC, E_NOTICE,
"ps_files_cleanup_dir: opendir(%s) 실패: %s(%d)",
             dirname, strerror(errno), errno);
        반환(0);
}

물론 Ubuntu/Debian에서는 여전히 gc 재활용이 있지만 이는 외부 cron 프로세스에 의해 수행됩니다. 기본값은 /etc/cron.d/php5:,
입니다.
코드 복사 코드는 다음과 같습니다.

09,39 * * * * 루트 [ -x /usr/lib/php5/maxlifetime ]
&& [ -d /var/lib/php5 ] && /var/lib/php5/
찾기 -type f -cmin $(/usr/lib/php5/maxlifetime) -print0
| xargs -n 200 -r -0 rm

또한, s_gc의 실행 여부를 판단할 때 PS(gc_divisor)와 PS(gc_probability)라는 두 가지 주요 변수가 있음을 알 수 있다. 이 두 변수는 각각 세션의 런타임 구성 항목 중 동일한 이름의 두 가지 구성 항목에 해당한다. :

session.gc_probability 및 session.gc_divisor의 기본값은 각각 1과 100입니다.

그리고 php_combined_lcg는 0~1 범위의 난수를 생성하는 난수 생성기이므로 위의 판단은 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

랜드 < 확률 / gc_divisor

즉, 기본적으로 GC 프로세스는 거의 100번에 한 번씩 호출될 수 있으므로 이 알림을 보게 될 확률은 적습니다.

이 공지를 닫으려면 다음을 설정하세요.

session.gc_probability = 0, s_gc가 실행되지 않도록 설정하세요.

물론 이 폴더의 권한을 변경할 수도 있습니다...

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.