视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
session加入mysql库的方法
2020-11-09 20:47:11 责编:小采
文档

我们知道,session是一种会话技术,用来实现跨脚本共享数据或者检测跟踪用户状态。

session的工作原理

(1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。

(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。

(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。

(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。

 session是存放在服务器端的文件里的,因此session有可能因为文件数量过多,会在查询session文件以及读取的时候产生压力。一般我们有三种解决方案

1.使用文件分层(缺点:I/O操作是系统的一个瓶颈,即使分层也不能避免此问题)

2.将session放入数据库

3.将session放在内存中(非关系性数据库)(缺点:对服务器内存要求教高)

随着 session的增加,管理已经不方便。

因此我们选用一个折中的办法,将session存入mysql数据库,也就是我们要讲的重点.

建立一个表管理 session 。

 

 更改 session的存储机制,让 session 不再存在文件中,而是入库。

更该存储机制,只需要在文件中增加函数session_set_save_handler() 便可。

<?php 
ini_set("session.save_handler","user"); 
//session.gc_probability = 1 分子 
ini_set("session.gc_probability",1); 
//session.gc_divisor = 1000 分母 
ini_set("session.gc_divisor",2); 
//session.gc_maxlifetime = 1440 垃圾回收时间,session有效期 
session_set_save_handler( "open","close","read","write","destroy","gc" ); 
//连接数据库 
function open(){ 
 @$link = mysql_connect('127.0.0.1', 'root', 'root'); 
 mysql_query('set names utf8'); 
 mysql_query('use wangbin'); 
 //<span>open 回调函数类似于类的构造函数, 在会话打开的时候会被调用。 
 这是自动开始会话或者通过调用 session_start() 手动开始会话 
 之后第一个被调用的回调函数。 此回调函数操作成功返回TRUE,反之返回FALSE。</span> 
} 
function close(){ 
 mysql_close(); 
 //<span>close 回调函数类似于类的析构函数。 在 write 回调函数调用之后调用。 
 当调用 session_write_close() 函数之后, 
 也会调用 close 回调函数。 此回调函数操作成功返回TRUE,反之返回FALSE。</span> 
} 
function read($sess_id){ 
 $sql = "select session_data from `session` where session_id = '$sess_id'"; 
 $result = mysql_query($sql); 
 if($rows = mysql_fetch_assoc($result)){ 
 return $rows['session_data']; } 
 else{ 
 return ''; 
 } 
<ol class="dp-py" start="1"><li class="alt"><span>如果会话中有数据,read 回调函数必须返回将会话数据编码(序列化)后的字符串。 </span></li><li class="alt"><span>如果会话中没有数据,read 回调函数返回空字符串。 </span></li><li class="alt"><span>在自动开始会话或者通过调用 session_start() 函数手动开始会话之后,</span></li><li class="alt"><span>PHP 内部调用 read 回调函数来获取会话数据。 在调用 read 之前,PHP会调用open回调函数。 
</span></li><li class="alt"><span>read 回调返回的序列化之后的字符串格式必须与 write 回调函数保存数据时的格式完全一致。</span></li><li class="alt"><span>PHP 会自动反序列化返回的字符串并填充 $_SESSION 超级全局变量。 
</span></li><li class="alt"><span>虽然数据看起来和 serialize() 函数很相似, 但是需要提醒的是,它们是不同的。 
</span></li><li class="alt"><span>请参考: session.serialize_handler。</span></li></ol> 
 } 
function write($sess_id,$sess_data){ 
 $sql = "insert into `session` (session_id,session_data,session_time) values('$sess_id','$sess_data', now()) on duplicate key update session_data = '$sess_data' , session_time = now()"; //这是为了gc() 
 return mysql_query($sql); 
 /* 
 <span>在会话保存数据时会调用 write 回调函数。 此回调函数接收当前会话ID以及$_SESSION中数据序列化之后的字符串作为参数。 
 序列化会话数据的过程由 PHP 根据 session.serialize_handler 设定值来完成。</span> 
 <span>序列化后的数据将和会话 ID 关联在一起进行保存。 当调用 read 回调函数获取数据时, 
 所返回的数据必须要和传入write回调函数的数据完全保持一致。</span><span> 
 PHP 会在脚本执行完毕或调用 session_write_close() 函数之后调用此回调函数。 
 注意,在调用完此回调函数之后,PHP 内部会调用 close 回调函数。 </span> 
 Note: 
 <span>PHP 会在
输出流写入完毕并且关闭之后 才调用 write 回调函数, 所以在 write 回调函数中的调试信息不会输出到浏览器中。 如果需要在 write 回调函数中使用调试输出, 建议将调试输出写入到文件。</span> */ } function destroy($sess_id){ echo __FUNCTION__; $sql = "delete from `session` where session_id = '$sess_id'"; return mysql_query($sql); /* <span>当调用 session_destroy() 函数,或者调用 session_regenerate_id() 函数并且设置 destroy 参数为 TRUE 时, 会调用此回调函数。此回调函数操作成功返回 TRUE,反之返回 FALSE。</span> */ } function gc($sess_id){ $maxlifetime = ini_set("session.gc_maxlifetime"); echo __FUNCTION__; $sql = "delete from `session` where now()-session_time > '$maxlifetime' "; return mysql_query($sql); /* <span>为了清理会话中的旧数据,PHP 会不时的调用垃圾收集回调函数。 调用周期由 session.gc_probability 和 session.gc_divisor 参数控制。 传入到此回调函数的 lifetime 参数由 session.gc_maxlifetime 设置。 此回调函数操作成功返回 TRUE,反之返回 FALSE。</span> */ } header("content-type:text/html;charset=utf8"); session_start(); $_SESSION['name']='aa'; //echo session_id(); echo $_SESSION['name'];

 总结 session 运行机制:

1. 打开 session 时,语法上执行函数 session_start() ,php 的session 机制读取浏览器端的 cookie,语法上表示为$_cookie['PHPSESSID']。

2. 根据 cookie 找到存储在服务器端的 session数据。

3. 把 session 数据反序列化,赋值给变量 $_SESSION。

4. 之后对变量 $_SESSION 的操作都是对变量的操作,不会更新 session文件。

5. 是否执行了 session_destroy() 函数,如果执行了,那么删除服务器端的session 文件。

6. 脚本结束时,判断是否有 sessin 文件,或者说是否执行过session_destroy() 方法。如果没有执行过,则把 $_SESSION 变量中的数据写入到 session文件中。如果执行过,那么什么也不做.

 

下载本文
显示全文
专题