30분 후에 PHP 세션을 만료하려면 어떻게 해야 합니까?
30분 동안 세션을 유지한 후 파괴해야 합니다.
세션 타임아웃을 직접 구현해야 합니다.다른 옵션(session.session_maxlife time과 session.cookie_life time) 모두 신뢰할 수 없습니다.그 이유를 설명하겠습니다.
첫 번째:
session session을 합니다.session_max 라이프 타임
session.session_maxlife time은 데이터를 'session'으로 간주하고 정리할 때까지의 초수를 지정합니다.세션 시작 중에 가비지 수집이 발생합니다.
그러나 가비지 컬렉터는 session.gc_probability를 session.gc_divisor로 나눈 확률로만 시작됩니다.이러한 옵션의 기본값(각각 1과 100)을 사용할 경우 확률은 1%에 불과합니다.
가비지 컬렉터가 더 자주 시작되도록 이러한 값을 간단히 조정할 수 있습니다.그러나 가비지 컬렉터가 시작되면 등록된 모든 세션의 유효성이 검사됩니다.그리고 이것은 비용 집약적입니다.
또한 PHP의 기본 session.save_handler 파일을 사용하는 경우 세션 데이터는 session.save_path에서 지정된 경로에 있는 파일에 저장됩니다.이 세션 핸들러를 사용하면 세션 데이터의 경과시간이 파일의 마지막 액세스 날짜가 아닌 마지막 수정 날짜에 계산됩니다.
주의: 기본 파일 기반 세션핸들러를 사용하는 경우 파일 시스템은 액세스 시간(시간)을 추적해야 합니다.Windows FAT 에서는, 시간 추적을 사용할 수 없는 FAT 파일 시스템이나 그 외의 파일 시스템에 막혀 있는 경우는, 세션의 가비지 수집을 처리할 다른 방법을 생각해 낼 필요가 있습니다.PHP 4.2.3 이후 atime 대신 mtime(수정일)을 사용하고 있습니다.따라서 시간 추적을 사용할 수 없는 파일 시스템에서 문제가 발생하지 않습니다.
따라서 세션 데이터가 최근에 업데이트되지 않았기 때문에 세션 자체가 유효한 것으로 간주되는 동안 세션 데이터 파일이 삭제될 수도 있습니다.
그리고 두 번째:
time session.session_sessions
session.session_displays는 브라우저로 전송되는 쿠키의 라이프타임을 초단위로 지정합니다.[…]
네, 그렇습니다.이것은 cookie의 라이프 타임에만 영향을 주고 세션 자체는 계속 유효할 수 있습니다.그러나 세션을 무효화하는 것은 서버의 작업이지 클라이언트가 아닙니다.그러니 이건 아무 도움도 안 돼요실제로 session.cookie_life time이 로 설정되어 있습니다.0는 세션의 쿠키를 브라우저를 닫을 때까지 유효한 실제 세션 쿠키로 만듭니다.
결론/최적의 해결책:
가장 좋은 해결책은 자신의 세션타임아웃을 실장하는 것입니다.마지막 활동(즉, 요청)의 시간을 나타내는 간단한 타임스탬프를 사용하여 요청마다 업데이트합니다.
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
// last request was more than 30 minutes ago
session_unset(); // unset $_SESSION variable for the run-time
session_destroy(); // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
모든 요청으로 세션 데이터를 업데이트하면 세션 파일의 수정 날짜도 변경되어 세션이 가비지 수집기에 의해 조기에 제거되지 않습니다.
세션 고정 등의 세션 공격을 피하기 위해 추가 타임스탬프를 사용하여 세션 ID를 정기적으로 재생성할 수도 있습니다.
if (!isset($_SESSION['CREATED'])) {
$_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
// session started more than 30 minutes ago
session_regenerate_id(true); // change session ID for the current session and invalidate old session ID
$_SESSION['CREATED'] = time(); // update creation time
}
주의:
session.gc_maxlifetime적어도 이 커스텀 유효기간 핸들러의 라이프 타임과 같아야 합니다(이 예에서는 유효기간).- 시작 후 30분 후가 아니라 30분 후에 세션을 종료하려면
setcookie이 「」로 되어 .time()+60*30쿠키
30분 안에 PHP 세션이 만료되는 간단한 방법입니다.
주의: 시간을 변경하려면 원하는 시간으로 30을 변경하고 변경하지 마십시오. * 60: 그러면 회의록이 나타납니다.
단위 : * ) : (30 * 60)
n* * = days 수 ( : (n * 24 * 60 * 60 )n = " " " " "
Login.php
<?php
session_start();
?>
<html>
<form name="form1" method="post">
<table>
<tr>
<td>Username</td>
<td><input type="text" name="text"></td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" name="pwd"></td>
</tr>
<tr>
<td><input type="submit" value="SignIn" name="submit"></td>
</tr>
</table>
</form>
</html>
<?php
if (isset($_POST['submit'])) {
$v1 = "FirstUser";
$v2 = "MyPassword";
$v3 = $_POST['text'];
$v4 = $_POST['pwd'];
if ($v1 == $v3 && $v2 == $v4) {
$_SESSION['luser'] = $v1;
$_SESSION['start'] = time(); // Taking now logged in time.
// Ending a session in 30 minutes from the starting time.
$_SESSION['expire'] = $_SESSION['start'] + (30 * 60);
header('Location: http://localhost/somefolder/homepage.php');
} else {
echo "Please enter the username or password again!";
}
}
?>
홈페이지php
<?php
session_start();
if (!isset($_SESSION['luser'])) {
echo "Please Login again";
echo "<a href='http://localhost/somefolder/login.php'>Click Here to Login</a>";
}
else {
$now = time(); // Checking the time now when home page starts.
if ($now > $_SESSION['expire']) {
session_destroy();
echo "Your session has expired! <a href='http://localhost/somefolder/login.php'>Login here</a>";
}
else { //Starting this else one [else1]
?>
<!-- From here all HTML coding can be done -->
<html>
Welcome
<?php
echo $_SESSION['luser'];
echo "<a href='http://localhost/somefolder/logout.php'>Log out</a>";
?>
</html>
<?php
}
}
?>
LogOut.php
<?php
session_start();
session_destroy();
header('Location: http://localhost/somefolder/login.php');
?>
설정된 시간 후에 사용자를 로그아웃하기 위한 것입니까?세션 생성 시간(또는 만료 시간)을 등록 시 설정하고 각 페이지의 로드를 체크하면 처리할 수 있습니다.
예:
$_SESSION['example'] = array('foo' => 'bar', 'registered' => time());
// later
if ((time() - $_SESSION['example']['registered']) > (60 * 30)) {
unset($_SESSION['example']);
}
편집: 뭔가 다른 의미가 있는 것 같습니다.
ini 설정을 사용하면 특정 수명 후 세션을 폐기할 수 있습니다.
편집: ini_set('session.gc_maxlife time', 60*30);
이 투고에서는 세션타임아웃을 제어하는 몇 가지 방법을 나타냅니다.http://bytes.com/topic/php/insights/889606-setting-timeout-php-sessions
IMHO 두 번째 옵션은 좋은 솔루션입니다.
<?php
/***
* Starts a session with a specific timeout and a specific GC probability.
* @param int $timeout The number of seconds until it should time out.
* @param int $probability The probablity, in int percentage, that the garbage
* collection routine will be triggered right now.
* @param strint $cookie_domain The domain path for the cookie.
*/
function session_start_timeout($timeout=5, $probability=100, $cookie_domain='/') {
// Set the max lifetime
ini_set("session.gc_maxlifetime", $timeout);
// Set the session cookie to timout
ini_set("session.cookie_lifetime", $timeout);
// Change the save path. Sessions stored in teh same path
// all share the same lifetime; the lowest lifetime will be
// used for all. Therefore, for this to work, the session
// must be stored in a directory where only sessions sharing
// it's lifetime are. Best to just dynamically create on.
$seperator = strstr(strtoupper(substr(PHP_OS, 0, 3)), "WIN") ? "\\" : "/";
$path = ini_get("session.save_path") . $seperator . "session_" . $timeout . "sec";
if(!file_exists($path)) {
if(!mkdir($path, 600)) {
trigger_error("Failed to create session save path directory '$path'. Check permissions.", E_USER_ERROR);
}
}
ini_set("session.save_path", $path);
// Set the chance to trigger the garbage collection.
ini_set("session.gc_probability", $probability);
ini_set("session.gc_divisor", 100); // Should always be 100
// Start the session!
session_start();
// Renew the time left until this session times out.
// If you skip this, the session will time out based
// on the time when it was created, rather than when
// it was last used.
if(isset($_COOKIE[session_name()])) {
setcookie(session_name(), $_COOKIE[session_name()], time() + $timeout, $cookie_domain);
}
}
, 그럼 응용단계에 순히히 사용 ?? ????.htaccess유효기간을 설정하는 파일
<IfModule mod_php5.c>
#Session timeout
php_value session.cookie_lifetime 1800
php_value session.gc_maxlifetime 1800
</IfModule>
를 사용합니다.session_set_cookie_params기능을 합니다.
이 함수를 호출해야 합니다.session_start()불러.
이것을 시험해 보세요.
$lifetime = strtotime('+30 minutes', 0);
session_set_cookie_params($lifetime);
session_start();
자세한 것은, http://php.net/manual/function.session-set-cookie-params.php 를 참조해 주세요.
if (isSet($_SESSION['started'])){
if((mktime() - $_SESSION['started'] - 60*30) > 0){
//Logout, destroy session, etc.
}
}
else {
$_SESSION['started'] = mktime();
}
실제로 다음과 같은 기능으로 간단합니다.데이터베이스 테이블 이름 'sessions'와 필드 'id' 및 'time'을 사용합니다.
사용자가 사이트 또는 서비스를 다시 방문할 때마다 이 함수를 실행하여 반환 값이 TRUE인지 확인해야 합니다.FALSE일 경우 사용자가 만료되어 세션이 파기됩니다(참고:이 함수는 데이터베이스 클래스를 사용하여 데이터베이스를 연결하고 쿼리합니다.물론 함수 내에서 이 작업을 수행할 수도 있습니다.
function session_timeout_ok() {
global $db;
$timeout = SESSION_TIMEOUT; //const, e.g. 6 * 60 for 6 minutes
$ok = false;
$session_id = session_id();
$sql = "SELECT time FROM sessions WHERE session_id = '".$session_id."'";
$rows = $db->query($sql);
if ($rows === false) {
//Timestamp could not be read
$ok = FALSE;
}
else {
//Timestamp was read succesfully
if (count($rows) > 0) {
$zeile = $rows[0];
$time_past = $zeile['time'];
if ( $timeout + $time_past < time() ) {
//Time has expired
session_destroy();
$sql = "DELETE FROM sessions WHERE session_id = '" . $session_id . "'";
$affected = $db -> query($sql);
$ok = FALSE;
}
else {
//Time is okay
$ok = TRUE;
$sql = "UPDATE sessions SET time='" . time() . "' WHERE session_id = '" . $session_id . "'";
$erg = $db -> query($sql);
if ($erg == false) {
//DB error
}
}
}
else {
//Session is new, write it to database table sessions
$sql = "INSERT INTO sessions(session_id,time) VALUES ('".$session_id."','".time()."')";
$res = $db->query($sql);
if ($res === FALSE) {
//Database error
$ok = false;
}
$ok = true;
}
return $ok;
}
return $ok;
}
세션에 타임스탬프 저장
<?php
$user = $_POST['user_name'];
$pass = $_POST['user_pass'];
require ('db_connection.php');
// Hey, always escape input if necessary!
$result = mysql_query(sprintf("SELECT * FROM accounts WHERE user_Name='%s' AND user_Pass='%s'", mysql_real_escape_string($user), mysql_real_escape_string($pass));
if( mysql_num_rows( $result ) > 0)
{
$array = mysql_fetch_assoc($result);
session_start();
$_SESSION['user_id'] = $user;
$_SESSION['login_time'] = time();
header("Location:loggedin.php");
}
else
{
header("Location:login.php");
}
?>
다음으로 타임스탬프가 허용된 시간창(1800초는 30분) 내에 있는지 확인합니다.
<?php
session_start();
if( !isset( $_SESSION['user_id'] ) || time() - $_SESSION['login_time'] > 1800)
{
header("Location:login.php");
}
else
{
// uncomment the next line to refresh the session, so it will expire after thirteen minutes of inactivity, and not thirteen minutes after login
//$_SESSION['login_time'] = time();
echo ( "this session is ". $_SESSION['user_id'] );
//show rest of the page and all other content
}
?>
모든 페이지에 로드된 인크루드 파일의 다음 코드 블록을 사용하십시오.
$expiry = 1800 ;//session expiry required after 30 mins
if (isset($_SESSION['LAST']) && (time() - $_SESSION['LAST'] > $expiry)) {
session_unset();
session_destroy();
}
$_SESSION['LAST'] = time();
2014년 크리스토퍼 크레이머가 https://www.php.net/manual/en/session.configuration.php#115842에 쓴 글에서 이 글은 나를 놀라게 했다.
debian(베이스) 시스템에서는 실행 시 session.gc_maxlife time을 변경해도 실제 효과가 없습니다.Debian은 session.session_probability=0을 설정하여 PHP의 자체 가비지 컬렉터를 사용하지 않도록 설정합니다.대신 cronjob이 30분마다 실행됩니다(/etc/cron.d/php5 참조).이 작업은 오래된 세션을 청소합니다.이 cronjob은 기본적으로 php.ini를 조사하여 session.gc_maxlifetime 값을 사용하여 클리닝할 세션을 결정합니다(/usr/lib/php5/maxlifetime 참조).[...]
PHP가 세션을 처리하는 방법은 초보자가 이해하기에는 상당히 혼란스럽습니다.세션 동작의 개요에 대해 설명하면 도움이 될 수 있습니다.세션의 동작(커스텀 세션 핸들러)
이 수업을 30분 동안 사용하세요.
class Session{
public static function init(){
ini_set('session.gc_maxlifetime', 1800) ;
session_start();
}
public static function set($key, $val){
$_SESSION[$key] =$val;
}
public static function get($key){
if(isset($_SESSION[$key])){
return $_SESSION[$key];
} else{
return false;
}
}
public static function checkSession(){
self::init();
if(self::get("adminlogin")==false){
self::destroy();
header("Location:login.php");
}
}
public static function checkLogin(){
self::init();
if(self::get("adminlogin")==true){
header("Location:index.php");
}
}
public static function destroy(){
session_destroy();
header("Location:login.php");
}
}
타임스탬프 사용 중...
<?php
if (!isset($_SESSION)) {
$session = session_start();
}
if ($session && !isset($_SESSION['login_time'])) {
if ($session == 1) {
$_SESSION['login_time']=time();
echo "Login :".$_SESSION['login_time'];
echo "<br>";
$_SESSION['idle_time']=$_SESSION['login_time']+20;
echo "Session Idle :".$_SESSION['idle_time'];
echo "<br>";
} else{
$_SESSION['login_time']="";
}
} else {
if (time()>$_SESSION['idle_time']){
echo "Session Idle :".$_SESSION['idle_time'];
echo "<br>";
echo "Current :".time();
echo "<br>";
echo "Session Time Out";
session_destroy();
session_unset();
} else {
echo "Logged In<br>";
}
}
?>
타임 스탬프를 사용하여 세션을 종료하기 위해 20초를 사용했습니다.
30분이 필요한 경우 1800(초당 30분)을 추가합니다.
대체 방법으로 DB를 직접 사용할 수 있습니다.DB 함수를 사용하여 chk_lgn이라고 부릅니다.
로그인 체크를 체크하여 로그인 여부를 확인하고 로그인 시 체크 날짜 타임스탬프를 사용자의 db 행/열에 마지막으로 활성화되도록 설정합니다.
거기서도 시간 체크를 해요.지금은 모든 페이지에 이 기능을 사용하고 있기 때문에 이 기능을 사용할 수 있습니다.
추신: 제가 본 사람은 아무도 순수한 DB 솔루션을 제안하지 않았습니다.
여기서 시간을 설정할 수 있습니다.
$lifespan = 1800;
ini_set('session.gc_maxlifetime', $lifespan); //default life time
현재 시간을 저장하고 비교해서 30분을 초과하면 현재 세션을 파기합니다.
언급URL : https://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes
'programing' 카테고리의 다른 글
| Vue.js의 메서드 내에서 입력 포커스 이벤트를 트리거하려면 어떻게 해야 합니까? (0) | 2022.11.02 |
|---|---|
| 속성별로 개체 목록 그룹화 (0) | 2022.11.02 |
| Composer에게 다른 PHP 버전을 사용하도록 지시합니다. (0) | 2022.11.02 |
| 서브 쿼리를 사용한mysql 업데이트 쿼리 (0) | 2022.11.02 |
| Android Studio 프로젝트에서 .jar를 만드는 방법 (0) | 2022.11.02 |