Session_set_save_handler 之 文本模式實現

一、構建session抽象類,實現Session_set_save_hanlder函數必須的基礎函數php

<?php
    /* 實現session利用文件形式或者數據庫等其它形式進行存儲操做
     * author:Libin
     * Data:2014-06-24
     * 抽象頂層
    */
    abstract class session {
        /* open::設置存儲路徑 */
        abstract public function open();
        /* close::關閉存儲模式句柄 */
        abstract public function close();
        /* read::根據key查詢對應的value,典型的鍵值對 */
        abstract public function read($key);
        /* write::寫session */
        abstract public function write($key,$value);
        /* destory::銷燬某key的session */
        abstract public function destory($key);
        /* gc::回收機制,清除過時指定時間(分鐘)session數據 */
        abstract public function gc($min = 0);
        /* start::開啓session方法重寫 */
        abstract public function start();
    }
?>
View Code

二、編寫txt文本模式具體方法實現類mysql

<?php
    /* 實現session利用文件形式或者數據庫等其它形式進行存儲操做
     * author:Libin
     * Data:2014-06-24
     * 文本(txt)實現方法
    */
    class session_txt extends session {
        
        /* 變量存儲 */
        private $save_path   = '';//session保存路徑
        private $file_path   = '';//session文件路徑
        private $save_name   = '';//session命名
        private $save_hand   = null;//資源句柄
        private $save_prefix = 'mysession_';//session前綴
        
        /* open::設置存儲路徑 */
        final public function open(){
            $this->save_path = 'D:\session';
            if(!is_dir($this->save_path)){
                if(!mkdir($this->save_path)){
                    return false;
                };
            }
            $this->gc();//啓用回收機制
            return true;
        }
        /* close::關閉存儲模式句柄 */
        final public function close(){
            return true;
        }
        /* read::根據key查詢對應的value,典型的鍵值對 */
        final public function read($key){
            $this->set(__function__,$key);
            $data = @fread($this->save_hand,filesize($this->file_path));
            if(empty($data) || $data == ''){
                return '';
            }return $data;
        }
        /* write::寫session */
        final public function write($key,$value){
            $this->set(__function__,$key);
            return @fwrite($this->save_hand,$value);
        }
        /* destory::銷燬某key的session */
        final public function destory($key){
            $this->set(__function__,$key);
            return @unlink($this->file_path);
        }
        /* gc::回收機制,清除過時指定時間(分鐘)session數據 */
        final public function gc($min = 10){
            $hand = @opendir($this->save_path);//打開文件夾
            while($file = @readdir($hand)){//遍歷文件夾
                if(is_file($this->save_path.'/'.$file)){//若是爲文件,排除.||..
                    $fileatime = fileatime($this->save_path.'/'.$file);//獲取文件最後修改時間
                    if(((time() - $fileatime) / 60) > $min){//若是時間相差大於$min分鐘
                        unlink($this->save_path.'/'.$file);//執行文件清理功能
                    }
                }
            }
            return true;
        }
        
        #################################################################################
        
        /* MAGIC __SET */
        final public function __set($key,$value){
            $this->$key = $value;
            return true;
        }
        
        /* 獲取存儲句柄 */
        final private function set($mode = 'read',$key){
            $this->file_path = $this->save_path.'/'.$this->save_prefix.$key;//設置文件路徑
            if($mode != 'read' && $mode != 'write'){return false;};
            $mode = $mode == 'write' ? 'w' : 'r';//讀或寫
            $this->save_hand = @fopen($this->file_path,$mode);
        }
        
        /* start::開啓session方法重寫 */
        final public function start(){
            @session_set_save_handler(array($this,'open'),array($this,'close'),array($this,'read'),array($this,'write'),array($this,'destory'),array($this,'gc'));
            ob_start();
            session_start();
            ob_end_flush();
        }
    }
?>
View Code

三、引入session.php,實現工廠模式最後一步sql

<?php
    /* 實現session利用文件形式或者數據庫等其它形式進行存儲操做
     * author:Libin
     * Data:2014-06-24
     * 工廠模式
    */
    class _session_start {
        /* 構造函數 */
        static public function __start($mode = 'txt'){
            require_once('session.class.php');//加載抽象方法
            if(!require_once('function/'.$mode.'.php')){
                return false;
            }else{
                $session_handle     = 'session_'.$mode;
                $handler             = new $session_handle();
                $handler->start();
            }
        }
    }
    _session_start::__start('txt');//重寫session函數開始
?>

PS::明兒個編寫mysql實現此功能,今天就到此爲止啦啦啦!數據庫

相關文章
相關標籤/搜索