session 加入mysql库的方法

我们知道,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文件中。如果执行过,那么什么也不做.

以上就是对session 加入 mysql库的资料整理,需要的朋友可以参考下。

(0)

相关推荐

  • PHP实现利用MySQL保存session的方法

    session是PHP程序设计中服务器端用来保存用户信息的一个变量,具有非常广泛的应用价值.本文实例讲述了PHP实现利用MySQL保存session的方法.分享给大家供大家参考之用.具体步骤如下: 本文实例的实现环境为: PHP 5.4.24 MySQL 5.6.19 OS X 10.9.4/Apache 2.2.26 一.代码部分 1.SQL语句: CREATE TABLE `session` ( `skey` char(32) CHARACTER SET ascii NOT NULL, `d

  • web.py在SAE中的Session问题解决方法(使用mysql存储)

    这段时间一直想尝试着在SAE中使用Python,初步选择了Web.py框架做为开发框架,但是可怜SAE上的资料少的可怜,有点问题基本上解决不了,今天解决一个Session在Session的存储问题,在SAE中不能直接用本地文件存储,好像是权限的原因,我现在采用的是保存在mysql中,效果也不错.希望对大家有帮助.直接上代码了. index.wsgi #!/usr/bin/env python # coding: utf-8 import os import web import sae from

  • php中使用session_set_save_handler()函数把session保存到MySQL数据库实例

    PHP保存session默认的是采用的文件的方式来保存的,这仅仅在文件的空间开销很小的windows上是可以采用的,但是如果我们采用uinx或者是liux上的文件系统的时候,这样的文件系统的文件空间开销是很大的,然而session是要时时刻刻的使用的,大量的用户就要创建很多的session文件,这样对整个的服务器带来性能问题. 另一方面,如果服务器起采用群集的方式的话就不能保持session的一致性,所以我们就绪要采用数据库的方式来保存session,这样,不管有几台服务器同时使用,只要把他们的

  • PHP用mysql数据库存储session的代码

    隐患一:如果客户端机器的cookie一旦因病毒而失效了,那么session也就相当于没有了. 隐患二:session在php中默认的是以文件的形式保存在一个临时文件夹里面的,对于一个小型系统来说,这样做完全可以, 可是对于一个大型而又被经常访问的系统来说,就不是很好的办法了.假设这个网站一天有1000个人访问.一个月以后session的临时文件夹就会有30000个临时文件.想象一下计算机要从30000里面找一条session_sid是一个多么漫长的事情呀! 因此为了提高效率. 交易使用用数据库保

  • 优化使用mysql存储session的php代码

    之前写过两篇文章<自定义SESSION(二)--数据库保存>和<我为什么不使用session>   但后来发现都有问题.前者处理在实际中几乎没什么用处,而且session回收还得自己另外处理.后者频繁的操作数据库,打来了很大的性能问题. 这两天仔细考虑下,大致给出一个方案,但还没有具体详细的测试.   1.session处理和统计结合起来.同时游客也都有记录.   2.完全使用数据库和cookie来模拟session的功能.   3.用户的对session的操作都尽量保证在一条sq

  • 用mysql内存表来代替php session的类

    复制代码 代码如下: <?php /** @Usage: use some other storage method(mysql or memcache) instead of php sessoin @author:lein @Version:1.0 */ session_start(); if(!isset($_SESSION['test'])){ $_SESSION['test']="123_lein_".date("Y-m-d H:i:s"); } c

  • ThinkPHP实现将SESSION存入MYSQL的方法

    本文以实例讲解了ThinkPHP实现将SESSION存入MYSQL的方法,所采用的运行环境是ThinkPHP3.1.2版 首先index.php中设置为: <?php define('APP_DEBUG', true);//设置为调试模式 require '../ThinkPHP/ThinkPHP.php';//设置入口文件 ini_set("session.save_handler", "user");//设置PHP的SESSION由用户定义 在config

  • session 加入mysql库的方法

    我们知道,session是一种会话技术,用来实现跨脚本共享数据或者检测跟踪用户状态. session的工作原理 (1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中. (2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量. (3)当执行PHP脚本时,通过使用session_register()函数注册session变量. (4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下

  • MySQL数据库安装方法与图形化管理工具介绍

    目录 一.Windows安装MySQL 1.下载 2.解压 3.配置 4.环境变量 5.初始化数据库 6.安装MySQL服务 7.启动mysql服务 8.更改密码和密码认证插件 9.测试 10.创建用户和权限: 二.Mysql图形化管理工具 1.Navicat Premium 12(推荐) 2.MySQL Workbench 1.官方下载地址: 2.配置 三.Linux安装MySQL 1.环境和资源地址 2.安装 1. 方式一(在线安装) 2 .方式二(离线安装) 3.操作mysql相关常用sh

  • mysql完整备份时过滤掉某些库的方法

    mysql进行完整备份时使用--all-database参数 比如: #mysqldump -u root -h localhost -p --all-database > /root/all.sql 数据导入的时候,可以先登陆mysql数据库中,使用source /root/all.sql进行导入. 问题: 想要在mysqldump备份数据库的时候,过滤掉某些库. 这种情况mysqldump备份的时候就不能使用--all-database了,而是使用--database. 如下:备份数据库的时

  • 删库跑路?使用xtraback备份MySQL数据库的方法

    一.mysqldump备份方式是采用逻辑备份.最大的缺陷就是备份和恢复的速度都慢,对于一个50G的数据库而言,这个速度还是可以接受的,但是如果数据库非常大,那在使用mysqdump备份就不是太合适了.. 这时候就需要一种很好用又高效的工具,xtraback 就是其中的一款,号称免费版的innodb hotbackup xtraback特点如下: 备份过程快速,可靠 备份过程不会打断正在执行的事务 能够基于压缩等功能节约磁盘空间和流量 自动实现备份检验 还原速度快 二.安装xtraback 1)下

  • MySQL制作具有千万条测试数据的测试库的方法

    有时候需要制造一些测试的数据,以mysql官方给的测试库为基础,插入十万,百万或者千万条数据.利用一些函数和存储过程来完成. 官方给的测试库地址:https://github.com/datacharmer/test_db 导入官方的数据库,做了一些简化,留下了部门表,员工表和雇佣表三张表,去掉了外键关联.因为是测试数据,日期的对应关系不具备准确性. 必要的函数 生成随机字符串 RAND():生成0~1之间的随机数 FLOOR:向下整数 (FlOOR(1.2)=1) CEILING 向上取整 (

  • MySQL数据库修复方法(MyISAM/InnoDB)

    在网上找了篇MySQL的技术文章,感觉不错,把它翻译过来共享下.   原文作者:Mike Peters   我整理了7条修复MySQL数据库的方法,当简单的重启对数据库不起作用,或者有表崩溃时.   简单的MySQL重启:   /usr/local/mysql/bin/mysqladmin -uUSERNAME -pPASSWORD shutdown /usr/local/mysql/bin/mysqld_safe &    1.MyISAM表崩溃    MySQL数据库允许不同的表使用不同的存

  • mysql 5.1版本修改密码及远程登录mysql数据库的方法

    mysql创建用户并授权: 格式:grant 权限 on 数据库名.表名 to 用户@登录主机 identified by "用户密码"; grant[英][grɑ:nt]   承认; 同意; 准许; 授予; 例1:允许mk用户从localhost登录 mysql> grant all on book.* to mk1@localhost identified by "123456"; #允许访问book数据库下的所有表, 只能访问book表,而且是同一个服务

  • MySQL修改密码方法总结

    方法一  使用phpmyadmin,这是最简单的了,修改mysql库的user表,  不过别忘了使用PASSWORD函数. 方法二  使用mysqladmin,这是前面声明的一个特例.  mysqladmin -u root -p password mypasswd  输入这个命令后,需要输入root的原密码,然后root的密码将改为mypasswd.  把命令里的root改为你的用户名,你就可以改你自己的密码了.  当然如果你的mysqladmin连接不上mysql server,或者你没有办

  • PHP编程中的Session阻塞问题与解决方法分析

    本文实例讲述了PHP编程中的Session阻塞问题与解决方法.分享给大家供大家参考,具体如下: 使用session过程中,在开启session后,同一浏览器,执行同一程序,不同页面会被锁.不同浏览器不会出现这种情况. 疑问:是不是session_start导致了阻塞? 于是,我写了几个页面测试了一下,发现是session导致了阻塞,而其他两种情况不会造成阻塞. 查了下PHP的Bug列表,发现有人提出了这个问题: Description: ------------ Calling session_

随机推荐