ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] * * * * * # 1 Session >>Session。在服务器端存储会话信息 >服务器端可以使用多种存储方式存储Session。 >tp内置了3种session存储机制(Redis,memecache,memecached)。 >其实现在(session\driver\)目录下 ### Session::init() >>初始化Session。 ~~~ public static function init(array $config = []) { if (empty($config)) { $config = Config::get('session'); } // 记录初始化信息 App::$debug && Log::record('[ SESSION ] INIT ' . var_export($config, true), 'info'); $isDoStart = false; if (isset($config['use_trans_sid'])) { ini_set('session.use_trans_sid', $config['use_trans_sid'] ? 1 : 0); } // 启动session if (!empty($config['auto_start']) && PHP_SESSION_ACTIVE != session_status()) { ini_set('session.auto_start', 0); $isDoStart = true; } if (isset($config['prefix'])) { self::$prefix = $config['prefix']; } if (isset($config['var_session_id']) && isset($_REQUEST[$config['var_session_id']])) { session_id($_REQUEST[$config['var_session_id']]); } elseif (isset($config['id']) && !empty($config['id'])) { session_id($config['id']); } if (isset($config['name'])) { session_name($config['name']); } if (isset($config['path'])) { session_save_path($config['path']); } if (isset($config['domain'])) { ini_set('session.cookie_domain', $config['domain']); } if (isset($config['expire'])) { ini_set('session.gc_maxlifetime', $config['expire']); ini_set('session.cookie_lifetime', $config['expire']); } if (isset($config['use_cookies'])) { ini_set('session.use_cookies', $config['use_cookies'] ? 1 : 0); } if (isset($config['cache_limiter'])) { session_cache_limiter($config['cache_limiter']); } if (isset($config['cache_expire'])) { session_cache_expire($config['cache_expire']); } if (!empty($config['type'])) { // 读取session驱动 $class = false !== strpos($config['type'], '\\') ? $config['type'] : '\\think\\session\\driver\\' . ucwords($config['type']); // 检查驱动类 if (!class_exists($class) || !session_set_save_handler(new $class($config))) { throw new ClassNotFoundException('error session handler:' . $class, $class); } } if ($isDoStart) { session_start(); self::$init = true; } else { self::$init = false; } } ~~~ >根据配置,初始化session存储机制。 # 2 Session操作 ## 2-1 session管理 ### Session::boot() >>session自动启动 ~~~ public static function boot() { if (is_null(self::$init)) { self::init(); } elseif (false === self::$init) { session_start(); self::$init = true; } } ~~~ ### Session::start() >>启动session ~~~ public static function start() { session_start(); self::$init = true; } ~~~ ### Session::pause() >>暂停session ~~~ public static function pause() { // 暂停session session_write_close(); self::$init = false; } ~~~ ### Session::regenerate() >>重新生成session_id ~~~ private static function regenerate($delete = false) { session_regenerate_id($delete); } ~~~ ## 2-2 前缀操作 ### Session::prefix() >>设置session存储名称前缀 ~~~ public static function prefix($prefix = '') { if (empty($prefix) && null !== $prefix) { return self::$prefix; } else { self::$prefix = $prefix; } } ~~~ ## 2-3 数据操作 ### Session::set() >>session存储 ~~~ public static function set($name, $value = '', $prefix = null) { empty(self::$init) && self::boot(); $prefix = !is_null($prefix) ? $prefix : self::$prefix; if (strpos($name, '.')) { // 二维数组赋值 list($name1, $name2) = explode('.', $name); if ($prefix) { $_SESSION[$prefix][$name1][$name2] = $value; } else { $_SESSION[$name1][$name2] = $value; } } elseif ($prefix) { $_SESSION[$prefix][$name] = $value; } else { $_SESSION[$name] = $value; } } ~~~ ### Session::get() >>session读取 ~~~ public static function set($name, $value = '', $prefix = null) { empty(self::$init) && self::boot(); $prefix = !is_null($prefix) ? $prefix : self::$prefix; if (strpos($name, '.')) { // 二维数组赋值 list($name1, $name2) = explode('.', $name); if ($prefix) { $_SESSION[$prefix][$name1][$name2] = $value; } else { $_SESSION[$name1][$name2] = $value; } } elseif ($prefix) { $_SESSION[$prefix][$name] = $value; } else { $_SESSION[$name] = $value; } } ~~~ ### Session::pull() >>session读取并删除 ~~~ public static function pull($name, $prefix = null) { $result = self::get($name, $prefix); if ($result) { self::delete($name, $prefix); return $result; } else { return null; } } ~~~ ### Session::delete() >>session删除 ~~~ public static function delete($name, $prefix = null) { empty(self::$init) && self::boot(); $prefix = !is_null($prefix) ? $prefix : self::$prefix; if (strpos($name, '.')) { list($name1, $name2) = explode('.', $name); if ($prefix) { unset($_SESSION[$prefix][$name1][$name2]); } else { unset($_SESSION[$name1][$name2]); } } else { if ($prefix) { unset($_SESSION[$prefix][$name]); } else { unset($_SESSION[$name]); } } } ~~~ ### Session::clear() >>清空session数据 ~~~ public static function delete($name, $prefix = null) { empty(self::$init) && self::boot(); $prefix = !is_null($prefix) ? $prefix : self::$prefix; if (strpos($name, '.')) { list($name1, $name2) = explode('.', $name); if ($prefix) { unset($_SESSION[$prefix][$name1][$name2]); } else { unset($_SESSION[$name1][$name2]); } } else { if ($prefix) { unset($_SESSION[$prefix][$name]); } else { unset($_SESSION[$name]); } } } ~~~ ### Session::has() >>检测session数据 ~~~ public static function has($name, $prefix = null) { empty(self::$init) && self::boot(); $prefix = !is_null($prefix) ? $prefix : self::$prefix; if (strpos($name, '.')) { // 支持数组 list($name1, $name2) = explode('.', $name); return $prefix ? isset($_SESSION[$prefix][$name1][$name2]) : isset($_SESSION[$name1][$name2]); } else { return $prefix ? isset($_SESSION[$prefix][$name]) : isset($_SESSION[$name]); } } ~~~ # 3 Session存储(Redis) >>session内置了3种存储机制。Redis/Memcache/Memcached ### $redissession->__construct() ### $redissession->open() ### $redissession->close() ### $redissession->read() ### $redissession->write() ### $redissession->destroy()