php session 自定义的设置测试

<?php
    // ini_set('session.save_handler', 'user');

    // 注意 set_session_save_handler() 一定要在 session_start()前执行
    // session.gc_probability =1            //session 回收机制的概率分子
    // session.gc_divisor = 1000     // session 回收机制的概率分母
    // session.gc_maxlifetime = 1440 // session 有效期
    // 当开启 session 时,如 session_start(),
    // 执行顺序为 sess_open() -> sess_read()->sess_write() -> sess_close() ->sess_destroy() -> sess_gc()

ini_set("session.save_handler", "user"); // 自定义保存方式

function sess_open($sess_path, $sess_name)
{
    echo "session 路径:" . $sess_path . "<br />";
    echo "session名称:" . $sess_name . "<br />";
    return true;
}

function sess_close()
{
    echo "session 关闭<br />";
    return true;
}

function sess_read($sess_id)
{
    echo "读取session id :" . $sess_id . "<br />";
    return true;
}    

function sess_write($sess_id, $data)
{
    echo "写入数据 session id " . $sess_id . "<br />";
    echo "session 数据 " . $data . "<br />";
    return true;
}

function sess_destroy($sess_id)
{
    echo "销毁 session id " . $sess_id . "<br />";
    return true;
}

function sess_gc($sess_maxlifetime)
{
    echo "session 回时机制,每隔时间为 " . $sess_maxlifetime;
    return true;
}

session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
session_start();
$_SESSION['lin'] = 'lin3615';
echo 'hi, world ';
$_SESSION['long'] = 'good luck for you';
// 开启 cookie 时,默认时会以 session 名称 PHPSESSID 为了cookie 为记录
// 如 $_COOKIE['PHPSESSID'] = session_id; 值即为session_id值。

// 默认时,它们之间的关系是:session_name() = PHPSESSID ; $_COOKIE[session_name()] = session_id();
print_r($_COOKIE);

?>


================

以下适合

<?php
/*
数据表
CREATE TABLE IF NOT EXISTS `sessions` (
  `id` char(200) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `data` text COLLATE utf8_unicode_ci,
  `timestamp` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
*/
class Session
{

    /**
     * a database connection resource
     * @var resource

    $maxTime 生存时间
     */
    private $_sess_db;  
        private $maxTime;

    /**
     * Open the session
     * @return bool
     */
    public function open() {
                $this->maxTime = get_cfg_var("session.gc_maxlifetime") > 0 ? get_cfg_var("session.gc_maxlifetime") : 3600;
        if ($this->_sess_db = mysql_connect('localhost',
                                            'root',
                                            '123456')) {
            return mysql_select_db('test', $this->_sess_db);
        }
        return false;

    }



    /**
     * Close the session
     * @return bool
     */
    public function close() {

        return mysql_close($this->_sess_db);

    }

    /**
     * Read the session
     * @param int session id
     * @return string string of the sessoin
     */
    public function read($id) {

        $id = mysql_real_escape_string($id);
        $sql = "SELECT `data` FROM `sessions` " .
                       "WHERE id = '" . $id . "'";

        if ($result = mysql_query($sql, $this->_sess_db)) {
            if (mysql_num_rows($result)) {
                $record = mysql_fetch_assoc($result);
                return $record['data'];
            }
        }
        return '';

    }

    /**
     * Write the session
     * @param int session id
     * @param string data of the session
     */
         /*
         replace [into] 与 insert 功能类似,不同点在于:replace into 首先尝试插入数据表中,如果发现表中已经有此行数据(根据主键或者唯一索引判定)则先删除此行,然后插入新的数据。否则直接插入数据。要注意是:插入数据的表必须有主键或者唯一索引。否则就成了 insert 了
         */
    public function write($id, $data) {

        $sql = sprintf("REPLACE INTO `sessions` VALUES('%s', '%s', '%s')",
                       mysql_real_escape_string($id),
                       mysql_real_escape_string($data),
                       mysql_real_escape_string(time() + $this->maxTime));
        return mysql_query($sql, $this->_sess_db);

    }

    /**
     * Destoroy the session
     * @param int session id
     * @return bool
     */
    public function destroy($id) {

        $sql = sprintf("DELETE FROM `sessions` WHERE `id` = '%s'", $id);
        return mysql_query($sql, $this->_sess_db);

}

    /**
     * Garbage Collector
     * @param int life time (sec.)
     * @return bool
     * @see session.gc_divisor      100
     * @see session.gc_maxlifetime 1440
     * @see session.gc_probability    1
     * @usage execution rate 1/100
     *        (session.gc_probability/session.gc_divisor)
     */
    public function gc($max) {

        $sql = sprintf("DELETE FROM `sessions` WHERE `timestamp` < '%s'",
                       mysql_real_escape_string(time() - $max));
        return mysql_query($sql, $this->_sess_db);

    }

}

//ini_set('session.gc_probability', 50);

ini_set('session.save_handler', 'user');

$session = new Session();
session_set_save_handler(array($session, 'open'),
                         array($session, 'close'),
                         array($session, 'read'),
                         array($session, 'write'),
                         array($session, 'destroy'),
                         array($session, 'gc'));

// below sample main

session_start();
//session_regenerate_id(true);

if (isset($_SESSION['counter'])) {
    $_SESSION['counter']++;
} else {
    $_SESSION['counter'] = 1;

}

print_r($_SESSION);
//unset($_SESSION);
//session_destroy();
?>
<?php
// 以下这官网手册整合
/**
数据表
CREATE TABLE `ws_sessions` ( 
  `session_id` char(100)  NOT NULL default '', 
  `session_expires` int(11) unsigned NOT NULL default '0', 
  `session_data` text, 
  PRIMARY KEY  (`session_id`) 
) engine=InnoDB;
*/
class MySessionHandler implements SessionHandlerInterface
{
          // 生存时间
    public $lifeTime; 
    // 连接句柄 
    public $dbHandle; 
    function open($savePath, $sessName) { 
       // 获取生存时间 
       $this->lifeTime = get_cfg_var("session.gc_maxlifetime"); 

                         // $dbHandle = new mysqli("主机名", "用户名", "密码", "数据库名");
                         $dbHandle = new mysqli("localhost", "root", "", "test");

                                if($dbHandle->connect_error) 
           return false; 
       $this->dbHandle = $dbHandle; 
       return true; 
    } 
    function close() { 
        $this->gc(ini_get('session.gc_maxlifetime')); 
        // 关闭连接
        return $this->dbHandle->close(); 
    } 
    function read($sessID) { 
        // fetch session-data 
                                $res = $this->dbHandle->query("SELECT session_data AS d FROM ws_sessions 
                            WHERE session_id = '$sessID' 
                            AND session_expires > ".time());
                                                                                                                
                                
                                if($dd = $res->fetch_assoc())
                                {
                                        return $dd['d']; 
                                        }
        return ""; 
    } 
    function write($sessID,$sessData) { 
        // 新的有效时间
        $newExp = time() + $this->lifeTime; 
      
        $res = $this->dbHandle->query("SELECT * FROM ws_sessions 
                            WHERE session_id = '$sessID'");             
        // 有效 
        if($res->num_rows) { 
            // 更新
            $this->dbHandle->query("UPDATE ws_sessions 
                         SET session_expires = '$newExp', 
                         session_data = '$sessData' 
                         WHERE session_id = '$sessID'"); 
            // 更新是否生效 
            if($this->dbHandle->affected_rows) 
                return true; 
        } 
        else { 
            $this->dbHandle->query("INSERT INTO ws_sessions ( 
                         session_id, 
                         session_expires, 
                         session_data) 
                         VALUES( 
                         '" . $sessID ."', 
                         " . $newExp .", 
                         '" . $sessData ."')"); 
            // 更新是否生效 
            if($this->dbHandle->affected_rows) 
                return true; 
        } 
        // 发生错误
        return false; 
    } 
    function destroy($sessID) { 
        // delete session-data 
        $this->dbHandle->query("DELETE FROM ws_sessions WHERE session_id = '$sessID'"); 
        // if session was deleted, return true, 
        if($this->dbHandle->affected_rows) 
            return true; 
        // ...else return false 
        return false; 
    } 
    function gc($sessMaxLifeTime) { 
        // delete old sessions 
        $this->dbHandle->query("DELETE FROM ws_sessions WHERE session_expires < ".time()); 
        // return affected rows 
        return $this->dbHandle->affected_rows; 
    } 
}

ini_set('session.save_handler', 'user');
$handler = new MySessionHandler();
session_set_save_handler($handler, true);


// 引用方法,以为另存文件,如:session.php,新建立文件,如test.php
include('session.php');
session_start();
$_SESSION['lin3615'] = date('Y-m-d H:i:s', time());
print_r($_SESSION);