php session 保存数据库

session 保存数据库

  • 在服务器上,所有的网站都在使用同样的临时目录,就意味着多个程序在同一个位置进行文件的读取操作,那么我们可以利用技术编写一个程序来读取临时目录所有的数据,显然这样就有很大的安全隐患。如果有多台服务器,那么共享信息就很困难了。
  • 有时候我们需要长期保存SESSION数据,将SESSION缓存保存在临时文件就不可取了,而且随着SESSION的增多,也会增加服务器的负担,对服务器性能优化是很不利的。
  • 而解决SESSION的问题最好的方案无非就是利用PHP将SESSION会话保存到数据库,作为独立网站的 SESSION 会话状态,和其它网站的临时目录会话分隔开,不仅安全性会提高许多,而且也提高程序的规范性,使得网站的 SESSION 会话能够统一进行管理操作。

一、PHP 写一个会话类:sessionmysql.class.php

/*******************************************
 * 文件名: sessionmysql.class.php
 * 功能:     session保存数据库处理类--保存数据库方式为EasyDB
 * EasyDB的使用请参考 http://www.oschina.net/p/easydb?from=mail-notify
 * 版本:      1.0
 * 日期:     2016-06-08
 * 作者:      JoeXiong
 * 版权:      Copyright@2016 github.com/JoeXiong Inc All Rights Reserved
 *********************************************/
class session
{

    private $_lifetime;
    private $_db;
    private $_table;
    private $_userid;
    private $_domain = _COOKIE_DOMAIN_; // Cookie 作用域(.joeshop.cn)

    /**
     * 初始化
     *
     * @param unknown $etdbhandler            
     * @param number $lifetime            
     * @param number $userid            
     */
    function __construct($etdbhandler, $lifetime = 1440, $userid = 0)
    {
        $this->_table = 'joe_sessions';//表名
        $domain = $this->_domain;
        ini_set('session.cookie_domain', "$domain"); // session 跨域
        $this->_db = $etdbhandler;
        $this->_lifetime = $lifetime;
        $this->_userid = $userid;
        @ini_set('session.save_handler', 'user'); // 改变session处理机制为用户自定义
        $flag = session_set_save_handler(
            array(&$this,'open'), 
            array(&$this,'close'), 
            array(&$this,'read'), 
            array(&$this,'write'), 
            array(&$this,'destroy'), 
            array(&$this,'gc')
        );
        if (! session_id()) {
            session_start();
        }
    }

    function open($save_path, $session_name)
    {
        return true;
    }

    function close()
    {
        return true;
    }

    function read($id)
    {
        $sql = "SELECT SessionData FROM $this->_table WHERE SessionId=:id";
        $array = array(
            ':id' => $id
        );
        $result = $this->_db->queryOne($sql, $array);
    }

    function write($id, $data)
    {
        // funcPunlic::getIp() 获取提交者的IP
        $ip = addslashes(funcPunlic::getIp());
        $data = addslashes($data);
        if (strlen($data) > 500)
            $data = '';
        $times = time();
        $etimes = $times + $this->_lifetime;

        // $data中的键为数据库字段名,值为对应的数值
        $data = array(
            'SessionId' => "$id",
            'UserId' => $this->_userid,
            'Ip' => "$ip",
            'LastVisit' => "$times",
            'Expiration' => "$etimes",
            'SessionData' => "$data",
        );
        return $this->_db->insert($this->_table, $data);
    }

    function destroy($id)
    {
        $where = array(
            'SessionId' => "$id",
        );
        return $this->_db->delete($this->_table, $where);
    }

    function gc($maxlifetime)
    {
        $times = time();
        $where = array(
            'Expiration' => "Expiration<$times",
        );
        return $this->_db->delete($this->_table,$where);
    }
}

二、数据库设计

CREATE TABLE `joe_sessions` (
  `SessionId` varchar(32) NOT NULL,
  `UserId` int(10) unsigned NOT NULL DEFAULT '0',
  `Ip` varchar(100) DEFAULT NULL,
  `LastVisit` int(10) unsigned NOT NULL DEFAULT '0',
  `Expiration` int(10) unsigned NOT NULL DEFAULT '0',
  `SessionData` varchar(500) NOT NULL,
  PRIMARY KEY (`SessionId`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8 COMMENT='session表';
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值