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가 실행되지 않도록 설정하세요.
물론 이 폴더의 권한을 변경할 수도 있습니다...