ThinkPHP中关于session的Bug修复和session设置的自定义支持无限维数组

1 篇文章 0 订阅
1 篇文章 0 订阅

这里不是说TP不好,只是说没有什么是完美的,我们喜欢TP,我们希望TP变得更好

ThinkPHP中自带的session有些缺点:

  1. 如果不设置前缀,session(null)无效
  2. 同样,如果不设置前缀,session的过期时间也无效
  3. 根据源码,虽然支持数组设置,但是最多只能支持二维数组,有些场景下不够用
// 获取session
if (strpos($name, '.')) {
    list($name1, $name2) = explode('.', $name);
    return isset($_SESSION[$prefix][$name1][$name2]) ? $_SESSION[$prefix][$name1][$name2] : null;
}
...
// 设置session
if (strpos($name, '.')) {
    list($name1, $name2) = explode('.', $name);
    if ($prefix) {
        $_SESSION[$prefix][$name1][$name2] = $value;
    } else {
    $_SESSION[$name1][$name2] = $value;
}
...
// 删除session
if (strpos($name, '.')) {
    list($name1, $name2) = explode('.', $name);
    if ($prefix) {
        unset($_SESSION[$prefix][$name1][$name2]);
    } else {
        unset($_SESSION[$name1][$name2]);
    }
} 

可以看到,如果你用

session('user.name.famliy_name','Smith');

结果是

'user' => 
    array (size=1)
      'name' => string 'Smith' (length=5)

而不是我们希望的

'user' => 
    array (size=1)
      'name' => 
        array (size=1)
          'famliy_name' => string 'Smith' (length=5)

解决session()过期时间无效的问题

笨办法,直接自己设置一遍

ini_set('session.gc_maxlifetime', C('SEESION_LIFE_TIME'));
ini_set('session.cookie_lifetime', C('SEESION_LIFE_TIME'));

解决session()只能支持二维数组的赋值和读取

  1. session赋值
    自定义函数 set_session()

    /**
     * 设置session
     * @param $session_key
     * @param $new_value
     * @return void
     */
    function set_session($session_key,$new_value){
    	// 先获得键值
    	$session_key_array = explode('.',$session_key);
    	// 设置session
    	session_start();// ThinkPHP中默认开启,可以删除这一句
    	$current_session = &$_SESSION;
    	foreach ($session_key_array as $deep_level => $array_key) {
    		$current_session = &$current_session[$array_key];
    		if (($deep_level+1)===sizeof($session_key_array)) {
    			$current_session = $new_value;
    		}
    	}	
    }

    前面的例子:
     

    session('user.name.famliy_name','Smith');

    结果即为

    'user' => 
        array (size=1)
          'name' => 
            array (size=1)
              'famliy_name' => string 'Smith' (length=5)

     

  2. session读取    
    同理session赋值
    // 读取 session,不存在返回 false
    function get_session($session_key){
    	$session_key_array = explode('.',$session_key);
    	$current_session = &$_SESSION;
    	$flag = 0;
    	foreach ($session_key_array as $deep_level => $array_key) {
    		if (isset($current_session[$array_key])) {
    			$flag++;
    			$current_session = &$current_session[$array_key];
    		}
    		if (($deep_level+1)===sizeof($session_key_array)) {
    			return $flag===sizeof($session_key_array)?$current_session:false;
    		}
    	}
    	return false;
    }

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值