2011-10-19 2 views
36

PHP 매뉴얼에서 session.gc_probability와 session.gc_divisor는이 확률에 따라 gc가 발생한다고 설명합니다. 알 겠어.PHP 가비지 컬렉션 설명

이 확률이 세션별로 또는 전체적으로 세션에 있는지 여부는 확실하지 않습니다.

따라서 GC가 발생하는 확률이 1 % (1/100)라면 특정 세션이 정리 될 1 % 변경이있을 때마다 한 세션이 계속 확장되는 것을 의미합니까? 또는 기존의 모든 세션 (새 세션은 물론)의 1 %가 다른 모든 기존 세션에 대해 GC를 트리거한다는 의미입니까?

나는 꽤 후자라고 확신한다. 나는 확실히하고 싶다.

이 질문의 목적은 본 사이트에서 사용자들에게 장기간 세션 (6 개월)을 제공하기 위해서입니다. 모든 세션의 1 %가 GC를 트리거하면 GC는 매시 또는 2 시간마다 종료되므로 장기 세션을 갖는 목적을 효과적으로 제거합니다.

+2

매우 흥미로운 질문입니다! +1 –

+0

related http://stackoverflow.com/questions/3865303/debian-based-systems-session-killed-at-30-minutes-in-special-cron-how-to-overri –

+0

이 시도를 읽는 다른 사용자에게 6 개월의 세션 파일로 인해 심각한 성능 문제가 발생할 수 있습니다 (아래 명시). 그러나 session_set_save_handler()를 사용하여 FS 대신 DB를 사용하는 사용자 정의 세션 처리기를 작성하여 많은 성능 저하를 방지 할 수 있습니다. – Meep3D

답변

10

PHP 스크립트가 실행되고 세션이 시작될 때마다 세션 폴더를 통해 이전 세션을 종료 할 가능성이 있습니다.

정리는 특정 시간 내에 액세스되지 않은 세션 만 삭제합니다. 그러나 PHP는 세션이 그 시간 내에 파괴 될 것이라고 보장하지 않습니다.

장기 세션 전략이 잘 작동해야하지만 당신은 0.1 %

피려하는 또 다른 일이 같은 것을 1 %를 절감 할 수 있습니다는 동안/TMP 폴더를 정리할 수있는 해당 운영 체제입니다 PHP가 그렇게하지 않더라도 재부팅하십시오.

+0

저는 확률을 1/100에서 1/1000000으로 줄였습니다 (0.000001 %). 문제가 해결되기를 바랍니다. 또한 이것은 Magento 사이트이므로 세션은/var/session에 저장됩니다. 이 폴더는 내가 아는 한 서버에 의해 영향을받지 않습니다 (하지만 Magento 관리자에서 "캐시 저장 용량 비우기"를 선택하면 제거됩니다). – pspahn

+0

아, Magento가 gc_ * 설정을 무시하는 대체 세션을 구현하지 않기를 바랍니다. – romaninsh

+5

과 그 가능성을 줄이는 부작용은 오래된 세션으로 하드 드라이브를 채우는 것입니다. 세션을 찾아서로드하는 데 시간이 오래 걸리며 하루가 끝날 때까지는 세션을 완전히 지울 수 있습니다 (원격으로는 작지만). 당신은 당신 자신의 세션 핸들러를 작성하고 제거하고 싶은 세션을 정확하게 제어하는 ​​것과 같은 대안적인 옵션을 볼 수 있습니다. 그다지 어렵지 않습니다. http://www.php.net/manual/en/function.session-set-save-handler.php – bumperbox

2

저는 전문가는 아니지만 설명서를 읽으면 다른 설정 인 session.gc_maxlifetime에주의를 환기시킵니다. 워드 프로세서 :

session.gc_maxlifetime 데이터가 정리 잠재적 "가비지"로 간주되고, 그 후에 시간 (초)를 지정한다. 세션 시작시 가비지 수집이 발생할 수 있습니다 (session.gc_probabilitysession.gc_divisor에 따라 다름). 당신이 적당한 값으로 설정을 설정 그렇다면

(반년 60 * 60 * 24 * 365/2, 그래서 15768000)를 선택한 다음, 해당 데이터에 상관없이 다른 설정이 무엇인지, 가비지 컬렉션을받을 수 없습니다되지 않습니다.

+1

이미 gc_maxlifetime을 15552000 (180 일)으로 설정했습니다. dev 사이트에서 모든 것이 제대로 작동하는 것처럼 보였지만 일단 라이브를 밀어 넣으면 사용자가 로그인 페이지로 돌아 오기 전에 잠시 작동했습니다. – pspahn

+7

이 값은 "세션 생성 후 초"또는 "마지막 수정 후 초"를 의미합니까? –

+0

가비지 컬렉터를 연기하여 사전에 세션 데이터가 저장되도록하고 쿠키 수명을 연장하여 올바르게 이해하면 세션 데이터 행에 고유 한 세션 ID를 저장해야합니다. – vikingben

7

전 마지막으로 session_start()를 호출 할 때마다 소스를보고 "주사위를 굴려"라고 말하면 제수와 확률을 사용합니다. 히트하면 session.gc_maxlifetime보다 오래된 모든 파일이 session.save_path 디렉토리에서 삭제됩니다. 나는 그것이 PHP의 수정이나 접근 시간을 사용했는지 잊어 버린다. 비록 PHP가 스크립트 실행의 끝에서 세션 파일을 기본적으로 덮어 쓰기 때문에 정상적인 상황에서는 중요하지 않지만 mod와 접근 시간은 거의 항상 일치해야한다.

// Rough psuedo code of how php's session_start() function works regarding garbage collection. 
function session_start() { 
    $percentChanceToGC = 100 * ini_get('session.gc_probability')/ini_get('session.session.gc_divisor'); 
    $shouldDoGarbageCollection = rand(1, 100) < $percentChanceToGC; 
    if ($shouldDoGarbageCollection) { 
     $expiredCutoffTime = time() - ini_get('session.gc_maxlifetime'); 
     foreach (scandir(ini_get('session.save_path')) as $sessionFile) { 
      if (filemtime($sessionFile) < $expiredCutoffTime) { 
       unlink($sessionFile); 
      } 
     } 
    } 

    // ... rest of code .... 
} 

최소 6 개월 동안 살기를 원한다면 얼마나 많은 세션 파일을 기다려야할지 모르겠다. php가 나이를 결정하기 위해 수천 개의 파일을 통계하는 데 약간의 시간이 걸릴 수 있다고 생각하십시오. 어쩌면이 데이터의 영구 저장을위한 다른 옵션을 고려해보십시오. 또는 php gc를 비활성화하고 오래된 세션 파일을 삭제하기 위해 cron 작업을 실행할 수 있습니다.그렇지 않으면 요청의 1 %가 gc를 트리거하고 PHP를 기다려야합니다. 다시 말해 지연 될 수 있습니다.