• 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);
    

      

  • 相关阅读:
    oracle实现自增id
    一些.NET 项目中经常使用的类库
    文件读取是判断是否读取到末尾
    文件操作
    第一个html文件
    HTML标签(持续更新)
    配置tomcat
    判断一个String中是否有指定字符或字符串
    去掉字符串中的某个字符
    把一个activity作为弹窗
  • 原文地址:https://www.cnblogs.com/lin3615/p/3598704.html
Copyright © 2020-2023  润新知