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

这里不是说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;
    }

     

你可能感兴趣的:(php,ThinkPHP,session)