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

    xiaoxiao2022-05-14  203

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

     


    最新回复(0)