zoukankan      html  css  js  c++  java
  • 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实现此功能,今天就到此为止啦啦啦!

  • 相关阅读:
    Visual C# 插件构架实战
    用CSS实现表格单元格数据自动换行或不换行
    页面代码开发规范:CSS命名规范(参考)
    UML之业务建模
    在.NET环境下将报表导出Excel和Word(网络转载)
    asp.net数据导出到Excel (从网络摘操)
    ASP.NET(VB)把数据导出到EXCEL的一种方法(网上转载)
    关于ASP,ASP.NET,VB.NET里的MD5加密函数(转载)
    .net打包自动安装数据库(转载)
    Cannot load required extension: curl
  • 原文地址:https://www.cnblogs.com/shibazi/p/3805620.html
Copyright © 2011-2022 走看看