Session_set_save_handler 之 文本模式实现

1、构建session抽象类,实现Session_set_save_hanlder函数必须的基础函数

<?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

2、编写txt文本模式具体方法实现类

<?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

3、引入session.php,实现工厂模式最后一步

<?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实现此功能,今天就到此为止啦啦啦!

你可能感兴趣的:(session)