[PHP] session DB에 저장 소스

  • 정리가 되지 않은 소스를 일단 메모
<?php
require_once $_SERVER['DOCUMENT_ROOT']."/inc/db_info.php";
require_once $_SERVER['DOCUMENT_ROOT']."/inc/func/system_func.php";

// 세션 수명 (작성&갱신시 마다 시간 추가)
// $SESS_LIFE = get_cfg_var("session.gc_maxlifetime"); // PHP 세션 수명 설정값
$SESS_LIFE = 6 * 60 * 60;

// DB 연결 (open)
function sess_open($save_path, $session_name){
      global $DB_CONN, $DB_HOST, $DB_NAME, $DB_USER, $DB_PASS;

      // DB 접속 확인
      if(!($DB_CONN = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME))){
            echo "CANNOT CONNECT DB : ".mysqli_error($DB_CONN);
            exit;
      }

      // DB 선택 확인
      if(!(mysqli_select_db($DB_CONN, $DB_NAME))){
            echo "CANNOT SELECT DB : ".mysqli_error($DB_CONN);
            exit;
      }

      return true;
}

// DB 닫기 (close)
function sess_close(){
      return true;
}

// 세션 로드 (read)
function sess_read($key){
      global $DB_CONN;
      $returnVal = "";

      // 세션이 살아있을 경우 로드
      $sess_query = "SELECT value FROM session WHERE sesskey = '$key' AND expiry > ".time();
      $sess_result = mysqli_query($DB_CONN, $sess_query);

      if(list($value) = mysqli_fetch_row($sess_result)){
            $returnVal = $value;
      }

      return $returnVal;
}

// 세션 작성 (write)
function sess_write($key, $value){
      global $DB_CONN, $SESS_LIFE;

      // IP값 변수에 로드
      $ip = BaseFunc::getRealClientIp();

      // 현재시간에 세션 지속시간 더하기 (세션 종료시간)
      $expiry = time() + $SESS_LIFE;

      $value = addslashes($value);

      // 세션 존재 여부 확인
      $sess_query = "SELECT * FROM session WHERE sesskey = '$key'";
      $sess_result = mysqli_query($DB_CONN, $sess_query);

      if($sess_result->num_rows > 0){
            // 세션 존재시 업데이트
            $sess_query = "UPDATE session SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > ".time();
            $sess_result = mysqli_query($DB_CONN, $sess_query) or die("update write err"); 
      }else{
            // 세션 미존재시 추가
            $sess_query = "INSERT INTO session (sesskey, ip, id, expiry, value) VALUES ('$key', '$ip', null, $expiry, '$value')";
            $sess_result = mysqli_query($DB_CONN, $sess_query);
      }

      return $sess_result;
}

// 세션 삭제 (destroy)
function sess_destroy($key){
      global $DB_CONN;

      // 해당 세션 삭제
      $sess_query = "DELETE FROM session WHERE sesskey = '".$key."'";
      $sess_result = mysqli_query($DB_CONN, $sess_query) or die(false);

      return true;
}

// 유통기한 지난 세션 정리 (gc)
function sess_gc($maxlifetime){
      // $maxlifetime <- 세션 수명 PHP 서버 설정값
      global $DB_CONN;

      // 기간 지난 세션 삭제
      $sess_query = "DELETE FROM session WHERE expiry < ".time();
      $sess_result = mysqli_query($DB_CONN, $sess_query) or die(false);

      return mysqli_affected_rows($DB_CONN);
}

// 세션 함수 등록
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");

// 세션 시작
session_start([
      // 'cookie_lifetime' => $SESS_LIFE,
      'cookie_httponly' => true
      ]);
?>

Leave a Comment