这里不是说TP不好,只是说没有什么是完美的,我们喜欢TP,我们希望TP变得更好
ThinkPHP中自带的session有些缺点:
如果不设置前缀,session(null)无效同样,如果不设置前缀,session的过期时间也无效根据源码,虽然支持数组设置,但是最多只能支持二维数组,有些场景下不够用 // 获取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)笨办法,直接自己设置一遍
ini_set('session.gc_maxlifetime', C('SEESION_LIFE_TIME')); ini_set('session.cookie_lifetime', C('SEESION_LIFE_TIME'));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)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; }