행복중입니다

DB 세션 핸들링

· 2021-09-28 (화) 23:41:48 · 2233 · 2

다들 아시는 내용이겠지만,

혹시 모르는분들을 위하여 공유합니다.

 

1. 환경

- mysql 또는 mariadb

- php 5.xx 이상

 

2. 구현

mysql에서 테이블을 생성합니다.

[code]

CREATE TABLE `Session` (
  `Session_Id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `Session_Expires` datetime NOT NULL,
  `Session_Data` text COLLATE utf8_unicode_ci,
  PRIMARY KEY (`Session_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

[/code]

 

inc.session.php 파일을 만들어 줍니다.

[code]

<?php
//inc.session.php

class SysSession implements SessionHandlerInterface
{
    private $link;
   
    public function open($savePath, $sessionName)
    {
        $link = mysqli_connect("server","user","pwd","mydatabase"); // 자신의 db정보를 기입합니다.
        if($link){
            $this->link = $link;
            return true;
        }else{
            return false;
        }
    }
    public function close()
    {
        mysqli_close($this->link);
        return true;
    }
    public function read($id)
    {
        $result = mysqli_query($this->link,"SELECT Session_Data FROM Session WHERE Session_Id = '".$id."' AND Session_Expires > '".date('Y-m-d H:i:s')."'");
        if($row = mysqli_fetch_assoc($result)){
            return $row['Session_Data'];
        }else{
            return "";
        }
    }
    public function write($id, $data)
    {
        $DateTime = date('Y-m-d H:i:s');
        $NewDateTime = date('Y-m-d H:i:s',strtotime($DateTime.' + 1 hour'));
        $result = mysqli_query($this->link,"REPLACE INTO Session SET Session_Id = '".$id."', Session_Expires = '".$NewDateTime."', Session_Data = '".$data."'");
        if($result){
            return true;
        }else{
            return false;
        }
    }
    public function destroy($id)
    {
        $result = mysqli_query($this->link,"DELETE FROM Session WHERE Session_Id ='".$id."'");
        if($result){
            return true;
        }else{
            return false;
        }
    }
    public function gc($maxlifetime)
    {
        $result = mysqli_query($this->link,"DELETE FROM Session WHERE ((UNIX_TIMESTAMP(Session_Expires) + ".$maxlifetime.") < ".$maxlifetime.")");
        if($result){
            return true;
        }else{
            return false;
        }
    }
}
$handler = new SysSession();
session_set_save_handler($handler, true);
?>

[/code]

 

db 세션핸들링이 잘되는지 세션 스타트 테스트를 해봅니다.

db에 잘들어가져 있으면 정상적으로 핸들링이 되는겁니다.

이코드를 잘 이해를 하셨다면 redis나 memcached같은 메모리db에서도 활용이 가능합니다.

 

[code]

<?php
//page 1
require_once('inc.session.php');

session_start();

$_SESSION['var1'] = "My Portuguese text: SOU Gaucho!";
?>

[/code]

|

댓글 2개

초보라서... 많이 배우고 있습니다.
감사합니다.
2022-09-02 (금) 16:05:17
감사합니다~!
댓글을 작성하시려면 로그인이 필요합니다.

개발자팁

5,403건

개발과 관련된 유용한 정보를 공유하세요. 질문은 QA에서 해주시기 바랍니다.

+
분류 제목 글쓴이 날짜 조회
기타 21-11-25 조회 3,486
웹서버 21-10-30 조회 3,020
웹서버 21-10-26 조회 4,082
PHP 21-10-25 조회 3,938
웹서버 21-10-24 조회 3,214
기타 21-10-22 조회 3,736
기타 21-10-06 조회 3,419
기타 21-10-01 조회 2,652
PHP 21-09-28 조회 2,234
PHP 21-09-28 조회 2,593
node.js 21-09-26 조회 2,452
node.js 21-09-24 조회 2,423
node.js 21-09-23 조회 2,124
node.js 21-09-21 조회 1,903
node.js 21-09-20 조회 1,980
기타 21-09-18 조회 3,541
웹서버 21-09-18 조회 3,457
MySQL 21-09-01 조회 2,175
기타 21-08-23 조회 2,128
OS 21-07-26 조회 2,737
웹서버 21-07-23 조회 4,357
OS 21-07-07 조회 3,110
PHP 21-06-24 조회 2,988
웹서버 21-06-22 조회 2,465
MySQL 21-06-08 조회 2,599
OS 21-05-26 조회 3,442
PHP 21-04-26 조회 5,094
MySQL 21-04-24 조회 2,489
MySQL 21-04-22 조회 2,624
MySQL 21-04-21 조회 4,932