session有可能因为文件的数量过多,会在查询session文件以及读取的时候产生压力。可以使用session分层来减少查询的压力,但是该方法并没有真正的解决I/O瓶颈问题。将session存入数据库可以实现多站点共享session,控制一个帐号只能一个人登录等功能。

session存放到数据库,一般我们是将session存放到内存(非关系型数据库)。

本例以存到mysql数据库为示例:

数据库结构:

CREATE TABLE `session` (
`sess_id`  varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`sess_info`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`sess_expire`  int(11) NOT NULL ,
PRIMARY KEY (`sess_id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
php代码:
<?php
    /*打开session*/
    function sess_open(){
        mysql_connect('127.0.0.1','root','root');
        mysql_query("use putsession");
    }

    /*关闭session*/
    function sess_close(){
        mysql_close();
    }

    /*读取session*/
    function sess_read($sess_id){
        /*根据sess_id查询数据库,获取session信息,过滤过期的数据*/
        $expire=time()-ini_get('session.gc_maxlifetime');
        $sql="SELECT * FROM session WHERE sess_id='{$sess_id}' AND sess_expire >= {$expire}";
        $res=mysql_query($sql);
        if($res){
            $sess=mysql_fetch_assoc($res);
            return $sess['sess_info'];
        }
    }

    /*写入session*/
    function sess_write($sess_id,$sess_info){
        $time=time();
        $sql="REPLACE INTO session VALUES('{$sess_id}','{$sess_info}','{$time}')";
        return mysql_query($sql);
    }

    /*销毁session*/
    function sess_destory($sess_id){
        $sql="DELETE FROM session WHERE sess_id='{$sess_id}'";
        return mysql_query($sql);
    }

    /*释放资源,垃圾回收*/
    function sess_gc(){
        /*判断session是否过期,过期删除*/
        $expire=time()-ini_get('session.gc_maxlifetime');//最迟的时间,此时间之前的会删除
        $sql="DELETE FROM session WHERE sess_expire < $expire";
        return mysql_query($sql);
    }

    /*session入库函数*/
    //bool session_set_save_handler (开启session机制函数 ,关闭session机制函数, 读取session数据函数 ,
        //写入session函数 , 销毁session函数, 回收过期session函数 )
    session_set_save_handler('sess_open','sess_close','sess_read','sess_write','sess_destory','sess_gc');
    /*开启session*/
    session_start();
    $_SESSION['name']='dogs';
    $_SESSION['age']=34;
    var_dump($_SESSION);
    /*销毁session*/
    session_destroy();

相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!