개발 꿀팁/PHP

PHP가 SESSION의 생존기간을 어떻게 수정하는지

Jammie 2022. 7. 5. 13:55
반응형

수요 배경:

사용자가 로그인을 하면 브라우저가 로그인 상태를 기억해줘 매번 로그인하지 않아도 된다.

세션 만료 시간:

세션 생성 시간을 설정하지 않으면 프로필에서 기본 생존 시간은 1440초입니다.

세션의 생존 시간이 24분이라는 것. 여기엔 이런 의문이 들 수 있다.

왜 내가 로그인하고 24분이 지나도 탈퇴하지 않는 거죠?

24분이 지나도 세션이 작동하지 않는데 왜 가입자가 탈퇴하지 않는지는 php의 회수기 때문이다.

프로필 php.ini에서 이 두 가지 프로필을 찾을 수 있습니다. 위의 설명은 기본적으로 동일합니다. 대략 다음과 같습니다.

"회수 메커니즘"은 각 세션의 초기화에 대한 확률적 이벤트입니다. 이 확률은 다음 공식에서 도출됩니다.

gc_probability를 gc_divisor로 나눈다.gc_probability 값이 1일 경우gc_divisor 값이 100이면 '회수 메커니즘'이 촉발될 확률은 1%다.

100건의 php 요청이 있을 경우 한 차례 '회수장치'가 촉발될 수 있다는 의미다.그러니까 만약에 sess가ion은 이미 기한이 지났지만, 없다.

'회수 메커니즘'이 촉발돼 세션 파일이 삭제되지 않으면 세션은 유효하다.

세션이 만료되는 즉시 삭제하도록 '회수 메커니즘'을 정교하게 트리거하는 경우 두 값을 모두 1로 설정합니다.

그러나 이는 PHP 성능에 미치는 영향이 크다.

세션 ID가 쿠키에 존재하는 시간:

일반적으로 우리는 브라우저를 닫는다. 만약 우리가 별도로 sess를 설정하지 않았다면ionID가 만료되면 브라우저는 쿠키에서 해당 sessionid를 삭제한다.

우리는 브라우저를 닫지 않았다. 세션의 시간이 왔다.효력이 상실됩니다. 단, php의 회수 메커니즘(아래 문장:PHP session 상세 참조)으로 인해 즉시 효력이 상실되지 않을 수 있습니다.

예:

<?php
 
session_start();
 
$_SESSION["username"] = "peter";
 
echo "등록된 사용자 이름:".$_SESSION["username"];
 
?>

세션 관련 정보는 'Settings' -> 'Advanced' -> 'Content settings' -> 'Cookies' -> 'See all cookies and site data'에서 확인할 사이트를 선택해도 확인할 수 있다

우리는 위의 코드를 다음과 같이 수정한다

<?php
 
$lifeTime = 24 * 3600;
 
session_set_cookie_params($lifeTime);
 
session_start();
 
$_SESSION["username"] = "peter";
 
echo "등록된 사용자 이름:".$_SESSION["username"];
?>

그러면 저희가 설정한 session이 쿠키에서 비활성화 시간이 수정되어 있는 것을 보실 수 있습니다

세션의 생존 시간 설정

1.가장 효과적인 방법 php를 수정한다.ini중

#session타임아웃을 할 수 있습니다
 
session.gc_maxlifetime = 1440

2. php를 통해 이 값을 수정한다

<?php
$Lifetime = 3600;
 
$DirectoryPath = "./tmp";
 
is_dir($DirectoryPath) or mkdir($DirectoryPath, 0777);
 
//url 기반 전달 sessionid를 켜는지 여부, 여기는 켜지 않고, 켜면 꺼집니다
 
if (ini_get("session.use_trans_sid") == true) {
 
ini_set("url_rewriter.tags", "");
 
ini_set("session.use_trans_sid", false);
 
}
 
ini_set("session.gc_maxlifetime", $Lifetime);//세션 생존 시간 설정
 
ini_set("session.gc_divisor", "1");
 
ini_set("session.gc_probability", "1");
 
ini_set("session.cookie_lifetime", "0");//sessionID있다cookie중생존기간
 
ini_set("session.save_path", $DirectoryPath);//session파일 저장 경로
session_start();
?>

참고: 만약 당신의 웹 사이트가 session_save_path를 사용자 정의했다면, session.gc_probability 값을 설정해야 합니다. 그렇지 않으면 session에서 생성된 sessionID 파일은 절대 삭제되지 않습니다.



3. 쿠키의 시간을 늘리고 세션의 시간을 변칙적으로 늘린다.

<?php
/**
* sessionid를 저장하는 시간만 설정했을 뿐 브라우저가 꺼진 후에도 session은 계속 사용할 수 있다
*session의 생존 기간을 실질적으로 변경하지 않고 있는데, 만약 session이 이미 기한이 지났다면, 이 또한 무의미하다
*/
 
//sessionid를 저장하는 쿠키의 만료 시간만 사용자가 처음 방문할 때 설정합니다
 
$lifetime=600;
 
session_set_cookie_params($lifetime);#注意到放到start的前面
 
session_start();
 
 
 
//매번 sessionid를 저장하는 쿠키의 만료 시간을 설정합니다
 
$lifetime=600;
 
session_start();
 
setcookie(session_name(),session_id(),time()+$lifetime);
 
?>

// 위, 매번 설정

주의:개인적으로 느끼거나, 설정하거나두 번째 방법은, 첫 번째와 세 번째를 결합시켜야 문제를 근본적으로 해결할 수 있습니다

<?php
 
$lifetime=86400;
 
session_set_cookie_params($lifetime);
 
session_start();
 
session_regenerate_id(true);
 
?>

 

반응형