这里不是说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)
解决session()过期时间无效的问题
笨办法,直接自己设置一遍
ini_set('session.gc_maxlifetime', C('SEESION_LIFE_TIME'));
ini_set('session.cookie_lifetime', C('SEESION_LIFE_TIME'));
解决session()只能支持二维数组的赋值和读取
-
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; }