php里少用到的session_module_name,以及session的key值限制,简单将session存储为json格式数据的方法
这个函数的作用就是动态的设置php.ini里的session_save_handler,配合session_set_savepath可以在程序里自由配置session的后台方式。
session_cache_expire与session_cache_limiter函数是配置session缓存时间与头信息的,比如private,public,nocache
与ini_set函数类似
都要在session_start()之前调用
session.save_handler = files
session.save_path = "E:/wamp/tmp/test" session.save_handler = memcache
session.save_path = "tcp://192.168.1.188:11211" switch($session->save_handler){
case 'memcache':
session_module_name('memcache');
session_save_path($session->save_path);
//自定义的时候
//SessionMemcache::init($session->save_path);
break;
case 'files':
if($session->save_path){
if(!file_exists($session->save_path)){
mkdir($session->save_path, true);
if(!file_exists($session->save_path){
exit('session_path is not exits');
}
}
session_module_name('files');
session_save_path($session->save_path);
}
break;
default:
break;
}
由于php的session扩展没有json的序列化方式,即使memcached有也不能实现session数据的json化。
使用session_set_save_handler可以在write里改写,但是这里的输入参数已经是序列化后的,所以要自己分解。
只要session_start()执行就会按照open,read,PHP的其他输出,write,close的顺序执行。
因为会话数据是被序列化的, resource 变量不能被存储在会话中.
序列化句柄 (php 和 php_binary) 会受到 register_globals 的限制. 而且,数字索引或者字符串索引包含的特殊字符(| 和 !) 不能被使用. 使用这些字符将脚本执行关闭时的最后出现错误. php_serialize 没有这样的限制.php_serialize 从 PHP 5.5.4 以后可用.
我还想半天session的反序列化,完美的方法不太好处理,这里限制session的所有键值都避免使用} | ;等敏感字符,没有经过完全测试,可能在复杂结构下会有问题,执行比原生的速度慢,而且随着数据量效率更差。
解决这个问题还是要从C扩展实现,不过临时的解决方案可以尝试一下。
class SessionMemcache{
    private static $_client = null;
    private static $_config = null;
    private static $_expire = ;
    private static $is_json = false;
    /**
     * 构造函数
     * @param unknown $session
     */
    private function __construct(){
       session_set_save_handler(
            array($this, 'open'),
            array($this, 'close'),
            array($this, 'read'),
            array($this, 'write'),
            array($this, 'destroy'),
            array($this, 'gc')
        );
    } 
    public static function init($configArray, $expire, $is_json = false){
        if(self::$_client == null){
            new self();
            self::$_config = $configArray;
            self::$_expire = $expire;
            self::$is_json = $is_json;
        }
        //register_shutdown_function('session_write_close');
    }
    /**
     * 打开session连接
     * @return boolean
     */
    public function open($savePath, $sessionName){
        self::$_client = Bootstrap::memFaction(self::$_config);
        return true;
    }
    /**
     * 关闭session连接
     * @return boolean
     */
    public function close(){
        return true;
    }
    /**
     * 读取session数据
     * @param unknown $id
     * @return Ambigous <NULL, unknown>
     */
    public function read($id){
        $data = self::$_client->get($id);
        if(strlen($data) >  && self::$is_json){
            $data = $this->session_json_decode(json_decode($data,true));
        }
        return ($data === false ? null : $data);
    }
    /**
     * 保存session数据
     * @param unknown $id
     * @param unknown $value
     */
    public function write($id, $value)
    {
        // $x = file_get_contents(ROOT_PATH . '/temp/sess.txt');
        // file_put_contents(ROOT_PATH . '/temp/sess.txt', sprintf("%s\n%s", $x, $value));
        //file_put_contents("D:/aa.txt", var_export($value,true));
        if(self::$is_json){
            $value = $this->session_json_encode($value);
        }
        //file_put_contents("D:/bb.txt", var_export($value,true));
        if (extension_loaded('memcached')) {
            $flag = self::$_client->set($id, $value, self::$_expire);
        } else {
            $flag = self::$_client->set($id, $value, , self::$_expire);
        }
        return $flag;
    }
    public function destroy($id)
    {
        return self::$_client->delete($id);
    }
    public function gc($maxLifetime)
    {
        return true;
    }
    protected function session_json_encode($value)
    {
        //按;XXX|切分字符串,对第一个和最后一个做特殊处理
        preg_match_all('/[};](\w+)\|/',$value,$matchs);//var_dump($matchs);exit;
        $serializeStr = "a:" . (count($matchs[])+) .":{";
        $str_copy = $value;
        foreach($matchs[] as $k => $v){
            $strBefore = strstr($str_copy,$v,true);
            $strAfter = strstr($str_copy,$v);
            $str_copy = substr($strAfter,strlen($v));
            if($k == ){
                $strOneBefore = strstr($strBefore,'|',true);
                $strOneAfter = strstr($strBefore,'|');
                $strOneAfter = substr($strOneAfter,);
                if($v[] == '}'){
                    $serializeStr .= 's:' . strlen($strOneBefore) . ':"' .$strOneBefore . '";' . $strOneAfter . '}';
                }else{
                    $serializeStr .= 's:' . strlen($strOneBefore) . ':"' .$strOneBefore . '";' . $strOneAfter . ';';
                }
            }else{
                if($v[] == '}'){
                    $serializeStr .= "s:" . strlen($matchs[][$k-]) . ':"' . $matchs[][$k-] . '";' . $strBefore .  '}';
                }else{
                    $serializeStr .= "s:" . strlen($matchs[][$k-]) . ':"' . $matchs[][$k-] . '";' . $strBefore .  ';';
                }
            }
            if(!isset($matchs[][$k+])){
                $serializeStr .= "s:" . strlen($matchs[][$k]) . ':"' . $matchs[][$k] . '";' . substr($strAfter,strlen($v)) .  '}';
            }
            //$delimit[]=$strBefore;
        }
        //$delimit[] = substr($strAfter,strlen($v));
        //var_dump($delimit);exit;
        //var_dump(unserialize($serializeStr));exit;
        //echo $serializeStr;exit;
        return json_encode(unserialize($serializeStr));
    }
    function session_json_decode(array $data){
        $ree = '';
        foreach($data as $k => $v){
            if(is_array($v)){
                $ree .= $k . '|' . serialize($v);
            }
            elseif(is_string($v)){
                $ree .= $k . '|s:' . strlen($k) . ':"' . $v . '";';
            }
            elseif(is_int($v)){
                $ree .= $k . '|i:' . $v . ';';
            }
            elseif(is_float($v)){
                $ree .= $k . '|d:' . $v . ';';
            }
            elseif(is_double($v)){
                $ree .= $k . '|d:' . $v . ';';
            }
        }
        return $ree;
    }
}
php里少用到的session_module_name,以及session的key值限制,简单将session存储为json格式数据的方法的更多相关文章
- requests接口自动化6-Body里json格式数据形式的post请求:json
		Body里json格式数据形式的post请求:用json传参 fiddler里请求响应内容: 传递的json数据 [{"stepId":"0","ca ... 
- 函数指针的返回值是指针数组,数组里放的是int;函数指针的返回值是指针数组,数组里放的是int指针
		函数指针的返回值是指针数组,数组里放的是int 函数指针的返回值是指针数组,数组里放的是int指针 #include <stdio.h> #include <stdlib.h> ... 
- vue :class 可以接收 字符串 数组 和 对象 对象里面的key值 根据true或false 显示不显示
		vue :class 可以接收 字符串 数组 和 对象 对象里面的key值 根据true或false 显示不显示 https://cn.vuejs.org/v2/guide/class-and-sty ... 
- 【MM系列】在SAP里查看数据的方法
		公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]在SAP里查看数据的方法 前言部 ... 
- foreach 里少用&$v
		foreach ( $prize_list as $k => $v ) { $prize_list[$k]['prize_view'] = DB::name('dati_prize_catego ... 
- Qt的Model/View Framework解析(数据是从真正的“肉(raw)”里取得,Model提供肉,所以读写文件、操作数据库、网络通讯等一系列与数据打交道的工作就在model中做了)
		最近在看Qt的Model/View Framework,在网上搜了搜,好像中文的除了几篇翻译没有什么有价值的文章.E文的除了Qt的官方介绍,其它文章也很少.看到一个老外在blog中写道Model/Vi ... 
- (六)Net Core项目使用Controller之一    c# log4net 不输出日志  .NET Standard库引用导致的FileNotFoundException探究   获取json串里的某个属性值   common.js  如何调用common.js   js 筛选数据  Join 具体用法
		(六)Net Core项目使用Controller之一 一.简介 1.当前最流行的开发模式是前后端分离,Controller作为后端的核心输出,是开发人员使用最多的技术点. 2.个人所在的团队已经选择 ... 
- MySQLWorkbench里的稀奇事之timestamp的非空默认值
		在创建表时,某字段为非空时间戳,timestamp not null 问题来了,使用workbench建表时,如果值非空,是需要有一个默认值的,不然会报错. 那么,如果是更新时自动填充可以使用DEFA ... 
- VS里的 代码片段(Code snippet)很有用,制作也很简单
		工欲善其事必先利其器,而 Visual Studio 就是我们的开发利器. 上一篇文章,介绍了一个很棒的快捷键,如果你还没用过这个快捷键,看完之后应该会豁然开朗.如果你已经熟练的应用它,也会温故而知新 ... 
随机推荐
- IOS第三方地图-百度地图集成
			百度地图官网: http://developer.baidu.com/map/index.php?title=iossdk 照上面吧百度地图sdk集成到工程 然后在pilst文件中加入: 如果地图没有 ... 
- POJ 2127
			#include <iostream> #define MAXN 501 using namespace std; int a[MAXN],b[MAXN],ans[MAXN]; int G ... 
- PHP5.4最新特性
			PHP5.4最新特性 官网:ChangeLog-5.php#5.4.0 原文Oracle:LAMP 体系有了新的竞争,但此版本中的特性使 PHP 再次挑战极限. 稍微做了修改.: 概述总结:1. ... 
- 网络处理1-异步GET请求
			前言 云计算 近几年来,云计算是一个非常热门的技术名词,很多专家认为,云计算会改变互联网的技术基础,甚至会影响整个产业的格局.可能还很多人不了解什么是云计算,简单来说,就是把用户的数据(比如文档.照片 ... 
- iOS复杂动画之抽丝剥茧(Objective-C & Swift)
			一.前言 随着开发者的增多和时间的累积,AppStore已经有非常多的应用了,每年都有很多新的APP产生.但是我们手机上留存的应用有限,所以如何吸引用户,成为产品设计的一项重要内容.其中炫酷的动画效果 ... 
- Java-J2SE学习笔记-字符串转化为二维数组
			1.字符串转化为二维Double数组 2.代码: package Test; public class TestDouble { public static void main(String[] ar ... 
- 《jQuery风暴》第2章 必须知道的JavaScript知识
			第2章 必须知道的JavaScript知识 JavaScript是jQuery应用的基础,掌握JavaScript这门语言是使用jQuery的基础条件.本章不会全面细致的讲解JavaScript的全部 ... 
- FreePascal经典资料
			------------------------------------------------------------------------ 这是每个版本的changelog: http://bu ... 
- Android APP安全评估工具 Drozer - 安装介绍
			一.Drozedr安装 注意事项:安装需要 JavaRuntime Environment (JRE) or Java Development Kit (JDK)环境, 没有安装的请先安装java环境 ... 
- 别在细节上栽跟头------------mysql 字段类型详解
			也许你平时不在意,在设计数据库的时候,数字就设成int(10) 字符串就设成varchar(20)或者text 普通情况下是没有问题的,但是若不理解字段类型和长度的含义,总有一天你会在这里栽跟头, 这 ... 
