>  기사  >  백엔드 개발  >  PHP의 세션 데이터베이스 저장소 인스턴스에 대한 자세한 설명

PHP의 세션 데이터베이스 저장소 인스턴스에 대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2017-04-28 16:41:382557검색

세션 저장 폴더를 변경하면 세션으로 인해 임시 폴더가 가득 차서 사이트가 다운되지는 않지만, 대규모 웹사이트의 경우 하루 로그인 인원이 1,000명, 한 달 로그인 인원이 3만명이라고 가정하면 계산할 수 있습니다. , 그러면 사이트에 30,000개의 세션 파일이 있습니다. 그러나 이 30,000개의 폴더에서 session_id를 쿼리하는 것은 쉽지 않습니다. 이때 세션 데이터베이스 저장소를 적용해야 합니다. 이는 PHP에서 session_set_save_handle()입니다. ) 기능입니다. 구문 형식은 다음과 같습니다.

session_set_save_handle(open, close, read, write, destroy,gc);

session_set_save_handle() 함수의 매개변수 설명은 다음과 같습니다.

参 数 说 明
open(save_path, session_name) 找到 Session 存储地址,取出变量名称
close() 不需要参数,关闭数据库
read(key) 读取 Session 键值, key 对应 session_id
write(key, data) 其中data 对应设置的 Session 变量
destroy(key) 注销 session 对应 Session 键值
gc(expiry_time) 清除过期的 Session 记录

일반적으로 응용 프로그램 매개변수는 변수를 직접 사용하지만 이 안에 있는 매개변수는 function은 6개의 함수이며, 호출되면 호출되는 함수 이름의 문자열일 뿐입니다. 이러한 매개변수는 아래에서 별도로 소개하고 마지막으로 이러한 함수를 클래스로 캡슐화합니다.

(1) session_open() 함수를 캡슐화하여 데이터베이스에 연결합니다. 코드 형식은 다음과 같습니다.

<?php
  function session_open($save_path,$session_name)
  {
     //连接 mysql 数据库
     $handle = mysqli_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;,&#39;db_test&#39;);
     // 判断数据库是否成功
     if(!$handle)
     {
        die(&#39;打开数据库失败&#39;);
     }
  }
?>

참고: 위 코드에서 $save_path $session_name 은 2개입니다. 두 개의 매개변수는 여기서 사용하지 않습니다. 여기서는 이 두 개의 매개변수를 삭제할 수 있지만, 일반적으로 이 두 개의 매개변수는 일반적으로 사용되기 때문에 입력된 두 개의 매개변수를 유지하는 것이 좋습니다.

(2) session_close() 함수를 캡슐화하여 데이터베이스 연결을 닫습니다. 코드 형식은 다음과 같습니다.

<?php
  function session_close()
  {
     $handle = mysqli_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;,&#39;db_test&#39;);
     mysqli_close($handle);
     return(true);
  }
?>

참고: 이 함수에는 매개변수가 필요하지 않습니다. 이므로 세션이 데이터베이스에 저장되어 있든 파일에 저장되어 있든 true만 반환하면 됩니다. 하지만 MYSQL 데이터베이스라면 향후 문제가 발생하지 않도록 데이터베이스를 닫는 것이 가장 좋습니다.

(3) session_read() 함수를 캡슐화하고, 함수에 현재 시간의 UNIX 타임스탬프를 설정하고, $key 값을 기준으로 세션 이름과 내용을 찾습니다.

<?php
  function session_read($key)
  {
     //连接数据库
     $handle = mysqli_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;,&#39;db_test&#39;);
     //设定当前时间
     $time = time();
     $sql = "select session_date from tb_session where session_key=&#39;$key&#39;and session_time>$time ";
     $result = mysqli_query($handle,$sql);
     $row = mysqli_fetch_array($result);
     if($row)
     {   //返回 Session 名称和内容
        return($row[&#39;session_date&#39;]);
     }else{
        return(false);
     }
  }
?>

데이터베이스에 저장된 session_expiry가 UNIX 타임스탬프임을 설명합니다.

(4) 세션 만료 시간을 설정하고 세션 이름과 콘텐츠를 검색하는 session_write() 함수를 캡슐화합니다. 쿼리 결과가 비어 있으면 현재 페이지의 세션이 session_id, session_name 및 만료 시간을 기반으로 데이터베이스에 삽입되고, 쿼리 결과가 비어 있지 않으면 $를 기반으로 데이터베이스의 세션 저장 정보가 수정됩니다.

<?php
  function session_write($key,$data)
  {
     //连接数据库
     $handle = mysqli_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;,&#39;db_test&#39;);
     //设定失效时间
     $time = 60*60;
     // 得到 UNIX 时间戳
     $lapse_time = time() + $time;
     $sql = "select session_date from tb_session where session_key=&#39;$key&#39;and session_time>$lapse_time ";
     $result = mysqli_query($handle,$sql);
     if(mysqli_num_rows($result) == 0)  // 没有结果
     {    //插入数据库SQL语句
        $sql = "insert into tb_session values (&#39;$key&#39;,&#39;$data&#39;,$lapse_time)";
        $result = mysqli_query($handle,$sql);
     }else{
        // 修改数据库SQL语句
        $sql = "update tb_session set session_key=&#39;$key&#39;, sessoin_data=&#39;$data&#39;, session_time=$lapse_time where session_key=&#39;$key&#39; ";
        $result = mysqli_query($handle,$sql);
     }
     return($result);
  }
?>

(5) $key에 따라 데이터베이스에서 Session을 삭제하려면 session_destroy() 함수를 캡슐화합니다. 코드는 다음과 같습니다.

<?php
  function session_destroy($key)
  {
     //连接数据库
     $handle = mysqli_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;,&#39;db_test&#39;);
     // 删除 Session 的 SQL 语句
     $sql = "delete from tb_session where session_key=&#39;$key&#39;";
     $result = mysqli_query($handle,$sql);
     return($result);
  }
?>

(6) session_gc() 함수를 캡슐화하고 지정된 만료 시간에 따라 만료된 세션을 삭제합니다.

<?php
  function session_gc($expiry_time)
  {
     //连接数据库
     $handle = mysqli_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;,&#39;db_test&#39;);
     // 将参数$expiry_time 赋值为当前时间戳
     $lapse_time = time();
     // 删除 Session 的 SQL 语句
     $sql = "delete from tb_session where expiry_time<$lapse_time";
     $result = mysqli_query($handle,$sql);
     return($result);
  }
?>

위는 session_set_save_handler() 함수의 6개 매개변수(함수)입니다.

다음은 session_set_save_handler() 함수를 사용하여 세션 저장 데이터베이스를 구현하는 코드입니다.

<?php session_set_save_handler(&#39;session_open&#39;,&#39;session_close&#39;,&#39;session_read&#39;,&#39;session_write&#39;,&#39;session_destroy&#39;,&#39;session_gc&#39;);
  session_start();
  // 下面为我们定义的 Session
  $_SESSION[&#39;user&#39;] = &#39;tom&#39;;
  $_SESSION[&#39;pwd&#39;] = &#39;12345&#39;;
?>

위 내용은 PHP의 세션 데이터베이스 저장소 인스턴스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.