+ -
当前位置:首页 → 问答吧 → 用数据库(mysql)存储session

用数据库(mysql)存储session

时间:2007-03-20

来源:互联网

大部分使用php的人一旦应用到session都会使用cookie。
cookie虽好可是它也会给我们带来一些隐患的。
隐患一:如果客户端机器的cookie一旦因病毒而失效了,那么session也就相当于没有了。
隐患二:session在php中默认的是以文件的形式保存在一个临时文件夹里面的,对于一个小型系统来说,这样做完全可以,
可是对于一个大型而又被经常访问的系统来说,就不是很好的办法了。假设这个网站一天有1000个人访问。一个月以后session的临时文件夹就会有30000个临时文件。想象一下计算机要从30000里面找一条session_sid是一个多么漫长的事情呀!
因此为了提高效率。
交易使用用数据库保存session。具体方法如下:
1.更改php.ini文件。
由于php默认保存session的方式是files所以我们要改变它。即:找到“session.save_handler = files”将“files”改为“User”。
把session的模式改成用户自定义的。
2.建立数据库:
CREATE TABLE `db_session` (
  `sesskey` char(32) NOT NULL,
  `expiry` int(11) unsigned NOT NULL,
  `value` text NOT NULL,
  PRIMARY KEY  (`sesskey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
数据库表明:db_session
列名:sesskey,expiry,value 其中:sesskey为主键。
Value里面存放着session里面的值。
3.建立session_mysql.php文件。这个文件是用来构造保存session的方法的。修改一下参数直接使用就可以了。
session_mysql.php
复制PHP内容到剪贴板
PHP代码:

<?php
       $gb_DBname="db_myBBS";//数据库名称
       $gb_DBuser="root";//数据库用户名称
       $gb_DBpass="23928484";//数据库密码
       $gb_DBHOSTname="localhost";//主机的名称或是IP地址
       
       $SESS_DBH="";
       $SESS_LIFE=get_cfg_var("session.gc_maxlifetime");//得到session的最大有效期。
       
       function sess_open($save_path,$session_name){
              global $gb_DBHOSTname,$gb_DBname,$gb_DBuser,$gb_DBpass,$SESS_DBH;
              if(!$SESS_DBH=mysql_pconnect($gb_DBHOSTname,$gb_DBuser,$gb_DBpass)){
                     echo "<li>MySql Error:".mysql_error()."<li>";
                     die();
              }
              if(!mysql_select_db($gb_DBname,$SESS_DBH)){
                     echo "<li>MySql Error:".mysql_error()."<li>";
                     die();
              }
              return true;
       }
       
       function sess_close(){
              return true;
       }
       
       function sess_read($key){
              global $SESS_DBH,$SESS_LIFE;
             $qry="select value from db_session where sesskey = '$key' and expiry > ".time();
             $qid=mysql_query($qry,$SESS_DBH);
              if(list($value)=mysql_fetch_row($qid)){
                     return $value;
              }
              return false;
       }
       
       function sess_write($key,$val){
              global $SESS_DBH,$SESS_LIFE;
              $expiry=time()+$SESS_LIFE;
              $value=$val;
              $qry="insert into db_session values('$key',$expiry,'$value')";
              $qid=mysql_query($qry,$SESS_DBH);
              if(!$qid){
                     $qry="update db_session set expiry=$expiry, value='$value' where sesskey='$key' and expiry >".time();
                     $qid=mysql_query($qry,$SESS_DBH);
              }
              return $qid;
       }
       
       function sess_destroy($key){
             global $SESS_DBH;
              $qry="delete from db_session where sesskey = '$key'";
              $qid=mysql_query($qry,$SESS_DBH);
              return $qid;
       }
       
       function sess_gc($maxlifetime){
              global $SESS_DBH;
              $qry="delete from db_session where expiry < ".time();
              $qid=mysql_query($qry,$SESS_DBH);
             return mysql_affected_rows($SESS_DBH);
       }
       session_module_name();
       session_set_save_handler("sess_open","sess_close","sess_read","sess_write","sess_destroy","sess_gc");
?>

4.建立测试文件。
在使用之前必须引用刚刚建立的session_mysql.php文件。
session_test.php
复制PHP内容到剪贴板
PHP代码:

<?php
include ("session_mysql.php");
session_start();
$_SESSION['abc']= "A: I will be back!";
$_SESSION['meto']= "B: Me too ";
$_SESSION['name']= "louis ";
echo "<a href=\"get_session_test.php\">click me</a>";
?>

get_session_test.php
<?php 
include ("session_mysql.php");
session_start();
echo $_SESSION['abc'];
echo "<br>";
echo $_SESSION['meto'];
echo "<br>";
echo $_SESSION['name'];
$_SESSION['wq']="12e";
echo "<br><a href=\"get_session_test2.php\">click again</a>";
?>

get_session_test2.php
<?php
include ("session_mysql.php");
session_start();
echo $_SESSION['abc'];
echo "<br>";
echo $_SESSION['meto'];
echo "<br>";
echo $_SESSION['name'];
echo "<br>";
echo $_SESSION['wq'];
//session_destroy();//用来销毁所有session的函数。
?>

看玩了,记得会一下帖子!要咱的心血不就白费了嘛!谢谢哈!

[ 本帖最后由 louis75168611 于 2007-3-21 14:41 编辑 ]

作者: louis75168611   发布时间: 2007-03-20

大家用的都是cookie吗??
这么没有人支持一下呢!!

作者: louis75168611   发布时间: 2007-03-21

支持下,很不错的

作者: softly   发布时间: 2007-03-21

3Q
还是有人支持的哦!

作者: louis75168611   发布时间: 2007-03-21

不错

作者: fengyun   发布时间: 2007-03-21

cookie如果被禁用,可以通过 get方式传递sessionid。

作者: 刀客羽朋   发布时间: 2007-03-21

这个主要解决的是用数据库保存session的临时文件。

当一个php程序一旦执行时间过长的时候那个session的临时文件夹下的文件就会越来越多。

用这种方法就可以避免这种情况。

作者: louis75168611   发布时间: 2007-03-22

当一个php程序一旦执行时间过长的时候那个session的临时文件夹下的文件就会越来越多。

定期清空就好了
还有怕php执行过长锁session文件的话可以在使用完session后马上关闭  session_write_close

感觉放数据库里主要是用来解决多服务器共享 session 的情况哈

作者: Phzzy   发布时间: 2007-03-22

版主的说法也对!
可以避免session共享。

作者: louis75168611   发布时间: 2007-03-23

好象这些文件会自动晴空的(里面的内容),只是有个空的文件而已,应该没有什么大的影响

作者: wolftooth   发布时间: 2007-03-26

但是东西还是挺不错的,顶下

作者: wolftooth   发布时间: 2007-03-26

3Q

作者: louis75168611   发布时间: 2007-03-27

共享SESSION的方式,把SESSION信息存在数据库里还是可以。
如果只是存放SESSINO的临时文件,放到库里其实效果并不如在指定文件夹下效率好些,我个人的观点。

作者: 特蓝克斯   发布时间: 2007-03-28

  不过原创的文章,我都会支持一下。
不错,可以研究研究

作者: 特蓝克斯   发布时间: 2007-03-28

支持原创,回去研究

作者: dayu   发布时间: 2007-03-28

数据库保存应该不必文件保存好,session多了,可以用分级存放啊,效率会好很多
session.save_path = "N;MODE;/path"

作者: 卖身养狗   发布时间: 2007-04-08

不是很长,先顶了再看

作者: emyshen   发布时间: 2007-05-01

session.save_handler = files

这个用ini_set这个函数改的话会又效果吗?
我还没测试过,先弱弱的问下,
别喷我阿!!

作者: emyshen   发布时间: 2007-05-01

终于看明白了,谢谢楼主了,呵呵

作者: emyshen   发布时间: 2007-05-01

ini_set函数测试成功,大家放心使用

作者: emyshen   发布时间: 2007-05-02

昵称: wangchun  时间: 2007-5-4 06:35
学习中

作者: wangchun   发布时间: 2007-05-04

为什么要用ENGINE=InnoDB

作者: silinwang   发布时间: 2007-05-09

引用:
原帖由 wangchun 于 2007-5-4 06:35 发表
这个代码好像是php5什么编程上的一个电子书上拷贝的,楼主一点新意都没有。10万记录的session,楼主的代码肯定跑得非常非常慢。估计按照秒来计算:lol
不会这么夸张吧,刚搞上去,不要吓我呢!!

作者: efootball   发布时间: 2007-05-11

今天无了聊,来灌灌水。。。。。。:lol

作者: DWer   发布时间: 2007-05-12

热门下载

更多