세션 저장 폴더를 변경하면 세션으로 인해 임시 폴더가 가득 차서 사이트가 다운되지는 않지만, 대규모 웹사이트의 경우 하루 로그인 인원이 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('localhost','root','root','db_test'); // 判断数据库是否成功 if(!$handle) { die('打开数据库失败'); } } ?>
참고: 위 코드에서 $save_path $session_name 은 2개입니다. 두 개의 매개변수는 여기서 사용하지 않습니다. 여기서는 이 두 개의 매개변수를 삭제할 수 있지만, 일반적으로 이 두 개의 매개변수는 일반적으로 사용되기 때문에 입력된 두 개의 매개변수를 유지하는 것이 좋습니다.
(2) session_close() 함수를 캡슐화하여 데이터베이스 연결을 닫습니다. 코드 형식은 다음과 같습니다.
<?php function session_close() { $handle = mysqli_connect('localhost','root','root','db_test'); mysqli_close($handle); return(true); } ?>
참고: 이 함수에는 매개변수가 필요하지 않습니다. 이므로 세션이 데이터베이스에 저장되어 있든 파일에 저장되어 있든 true만 반환하면 됩니다. 하지만 MYSQL 데이터베이스라면 향후 문제가 발생하지 않도록 데이터베이스를 닫는 것이 가장 좋습니다.
(3) session_read() 함수를 캡슐화하고, 함수에 현재 시간의 UNIX 타임스탬프를 설정하고, $key 값을 기준으로 세션 이름과 내용을 찾습니다.
<?php function session_read($key) { //连接数据库 $handle = mysqli_connect('localhost','root','root','db_test'); //设定当前时间 $time = time(); $sql = "select session_date from tb_session where session_key='$key'and session_time>$time "; $result = mysqli_query($handle,$sql); $row = mysqli_fetch_array($result); if($row) { //返回 Session 名称和内容 return($row['session_date']); }else{ return(false); } } ?>
데이터베이스에 저장된 session_expiry가 UNIX 타임스탬프임을 설명합니다.
(4) 세션 만료 시간을 설정하고 세션 이름과 콘텐츠를 검색하는 session_write() 함수를 캡슐화합니다. 쿼리 결과가 비어 있으면 현재 페이지의 세션이 session_id, session_name 및 만료 시간을 기반으로 데이터베이스에 삽입되고, 쿼리 결과가 비어 있지 않으면 $를 기반으로 데이터베이스의 세션 저장 정보가 수정됩니다.
<?php function session_write($key,$data) { //连接数据库 $handle = mysqli_connect('localhost','root','root','db_test'); //设定失效时间 $time = 60*60; // 得到 UNIX 时间戳 $lapse_time = time() + $time; $sql = "select session_date from tb_session where session_key='$key'and session_time>$lapse_time "; $result = mysqli_query($handle,$sql); if(mysqli_num_rows($result) == 0) // 没有结果 { //插入数据库SQL语句 $sql = "insert into tb_session values ('$key','$data',$lapse_time)"; $result = mysqli_query($handle,$sql); }else{ // 修改数据库SQL语句 $sql = "update tb_session set session_key='$key', sessoin_data='$data', session_time=$lapse_time where session_key='$key' "; $result = mysqli_query($handle,$sql); } return($result); } ?>
(5) $key에 따라 데이터베이스에서 Session을 삭제하려면 session_destroy() 함수를 캡슐화합니다. 코드는 다음과 같습니다.
<?php function session_destroy($key) { //连接数据库 $handle = mysqli_connect('localhost','root','root','db_test'); // 删除 Session 的 SQL 语句 $sql = "delete from tb_session where session_key='$key'"; $result = mysqli_query($handle,$sql); return($result); } ?>
(6) session_gc() 함수를 캡슐화하고 지정된 만료 시간에 따라 만료된 세션을 삭제합니다.
<?php function session_gc($expiry_time) { //连接数据库 $handle = mysqli_connect('localhost','root','root','db_test'); // 将参数$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('session_open','session_close','session_read','session_write','session_destroy','session_gc'); session_start(); // 下面为我们定义的 Session $_SESSION['user'] = 'tom'; $_SESSION['pwd'] = '12345'; ?>
위 내용은 PHP의 세션 데이터베이스 저장소 인스턴스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!