<?php
/**
CREATE TABLE IF NOT EXISTS `sessions` (
  `session` varchar(255) character set utf8 collate utf8_bin NOT NULL,
  `session_expires` int(10) unsigned NOT NULL default '0',
  `session_data` text collate utf8_unicode_ci,
  PRIMARY KEY  (`session`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
*/
class Session {
    /**
     * a database connection resource
     * @var resource
     */
    private static $_sess_db;    /**
     * Open the session
     * @return bool
     */
    public static function open() {
        
        if (self::$_sess_db = mysql_connect('localhost', 'root', '')) {
            return mysql_select_db('my_application', self::$_sess_db);
        }
        return false;
    }    /**
     * Close the session
     * @return bool
     */
    public static function close() {
        return mysql_close(self::$_sess_db);
    }    /**
     * Read the session
     * @param int session id
     * @return string string of the sessoin
     */
    public static function read($id) {
        $id = mysql_real_escape_string($id);
        $sql = sprintf("SELECT `session_data` FROM `sessions` WHERE `session` = '%s'", $id);
        if ($result = mysql_query($sql, self::$_sess_db)) {
            if (mysql_num_rows($result)) {
                $record = mysql_fetch_assoc($result);
                return $record['session_data'];
            }
        }
        return '';
    }    /**
     * Write the session
     * @param int session id
     * @param string data of the session
     */
    public static function write($id, $data) {
        $sql = sprintf("REPLACE INTO `sessions` VALUES('%s', '%s', '%s')",
                       mysql_real_escape_string($id),
                       mysql_real_escape_string(time()),
                       mysql_real_escape_string($data)
                       );
        return mysql_query($sql, self::$_sess_db);
    }    /**
     * Destoroy the session
     * @param int session id
     * @return bool
     */
    public static function destroy($id) {
        $sql = sprintf("DELETE FROM `sessions` WHERE `session` = '%s'", $id);
        return mysql_query($sql, self::$_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 static function gc($max) {
        $sql = sprintf("DELETE FROM `sessions` WHERE `session_expires` < '%s'",
                       mysql_real_escape_string(time() - $max));
        return mysql_query($sql, self::$_sess_db);
    }
}//ini_set('session.gc_probability', 50);
ini_set('session.save_handler', 'user');session_set_save_handler(array('Session', 'open'),
                         array('Session', 'close'),
                         array('Session', 'read'),
                         array('Session', 'write'),
                         array('Session', 'destroy'),
                         array('Session', 'gc')
                         );if (session_id() == "") session_start();
//session_regenerate_id(false); //also works fine
if (isset($_SESSION['counter'])) {
    $_SESSION['counter']++;
} else {
    $_SESSION['counter'] = 1;
}
echo '<br/>SessionID: '. session_id() .'<br/>Counter: '. $_SESSION['counter'];"open"  /*   session_start()调用   */  
"close"  /*   程序结束时调用   */  
"read"  /*   session_start()调用   */  
"write"  /*   程序结束时调用   */  
"destroy"  /*   session_destroy()调用   */  
"gc"  /* 操作系统gc进程调用   */上面是我从网上的例子中看到的(原文链接http://blog.csdn.net/zf213/archive/2009/06/22/4288567.aspx)
他例子中是
session_set_save_handler(array('Session', 'open'),
                         array('Session', 'close'),
                         array('Session', 'read'),
                         array('Session', 'write'),
                         array('Session', 'destroy'),
                         array('Session', 'gc')
                         );if (session_id() == "") session_start();
这样来调用,但他例子中的
function write($id, $data)
不是需要传递2个参数吗?而且这2个参数没设置默认值,所以肯定是要传递的吧??
谁能帮忙解释下一个session从初始化到被销毁时,session_set_save_handler是如何工作的?

解决方案 »

  1.   

    顺便...
    上面的
        public static function gc($max) {
            $sql = sprintf("DELETE FROM `sessions` WHERE `session_expires` < '%s'",
                           mysql_real_escape_string(time() - $max));
            return mysql_query($sql, self::$_sess_db);
        }
    就是在设置超时的吧?
    我把php.ini中的session.gc_maxlifetime设置为120,而且也重启服务器了
    打开网页(网页中echo ini_get(session.gc_maxlifetime) 显示的也是120),然后什么也不做,大概3分钟后再去点击刷新,他还是刚才的那个session啊...
    为什么会这样呢??
      

  2.   

    session_set_save_handler 只是通知php用用户定义的session方法替代php原有的处理而已
      

  3.   

    是不是可以这样理解
    PHP原本的session处理中也有open、close、read、write等方法,然后用户可以通过session_set_save_handler函数来让php调用用户自定义的open、close等方法?但我想知道的是,像上面的write方法中,有2个形参,$id和$data,它们又是怎么被传递过来的?
      

  4.   


    都是php内部调用啊,你$_SESSION['x']=3; 的时候,
    php就调用上面的write, id是session id, data就是3