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

  • 相关阅读:
    FNV与FNV-1a Hash算法说明【转】
    FNV哈希算法【转】
    git超详细教程【转】
    Git基础篇【转】
    Notepad++中常用的插件【转】
    美化博客园界面(让您的博客更加赏心悦目)希望对您有用【转】
    scanf()总结--从网上收来的,感觉很好,用来提醒自己,c语言真是博大精深!!【转】
    机器人程序设计——之如何正确入门ROS | 硬创公开课(附视频/PPT)【转】
    ROS学习网址【原创】
    机器人操作系统ROS Indigo 入门学习(1)——安装ROS Indigo【转】
  • 原文地址:https://www.cnblogs.com/shibazi/p/3805620.html
Copyright © 2020-2023  润新知