【Session】Session缓存Mysql数据库版
通过用户反馈服务器在使用时,如果网站过多或者并发过大,php自带的session可能会失效
于是就有个了这个数据库版本,模拟session功能,今天把主要逻辑代码分享出来
注意:代码中的DB类如果和你的程序不兼容需要自己改一下哦
// +---------------------------------------------------------------------- // | Nmae:Session数据库版 根据cookie生成设备标识,可替换本地服务器session过多出错问题 // +---------------------------------------------------------------------- // | Author: 沉梦执于梦 857285711 <blog.chenmyun.com> // +---------------------------------------------------------------------- // | Date: 2020/10/16 // +---------------------------------------------------------------------- class Session { /** * 设置Session * @param [type] $name [description] * @param [type] $value [description] * @param [type] $expire [description] */ public static function set($name, $value, $expire = null) { global $DB; $userid = self::getUserId(); if ($expire === null || $expire < time()) { $expire = time() + 3600; } try { $row = $DB->get_row("SELECT * FROM `auth_session` WHERE u= ? and k= ? limit 1", [$userid, $name]); if ($row != false && isset($row['id'])) { $data = [$value, $expire, $row['id']]; return $DB->query("UPDATE `auth_session` SET v= ?, e= ? WHERE `id`= ?", $data); } else { $sql = "INSERT INTO `auth_session` (`u`,`k`,`v`,`e`) VALUES (?, ?, ?, ?)"; $data = [$userid, $name, $value, $expire]; if ($DB->query($sql, $data)) { return true; } throw new \PDOException($DB->error()); } } catch (\PDOException $e) { die('数据库错误:' . $e->getMessage()); } catch (\Exception $e) { die('系统错误:' . $e->getMessage()); } } /** * 获取session * @param string $name session名称 * @return string */ public static function get($name = 'userid') { global $DB; $userid = self::getUserId(); $data = [$userid, $name]; $row = $DB->get_row("SELECT * FROM `auth_session` WHERE u= ? and k= ? limit 1", $data); if (is_array($row) && $row['e'] > time()) { return $row['v']; } return ''; } /** * 获取设备唯一标识 * @param boolean $update 是否刷新 */ public static function getUserId($update = false) { $userid = isset($_COOKIE['uid']) ? $_COOKIE['uid'] : null; if ($update || empty($userid) || !isset($_COOKIE['uid'])) { $userid = md5(uniqid(mt_rand(), 1) . time() . rand(1111, 9999) . x_real_ip()); setcookie('uid', $userid, time() + 86400 * 30, '/', null); } return $userid; } /** * 生成随机MD5字符串 * @return string */ public static function getRandString() { return md5(uniqid(mt_rand(), 1) . time() . rand(11111, 99999) . x_real_ip()); } /** * 清空当前设备cookie * @param [type] $name [description] * @return [type] [description] */ public static function checkDel($name) { $num = 0; if (is_array($_COOKIE)) { foreach ($_COOKIE as $key => $value) { if ($key == $name) { $num++; } } if ($num >= 2) { unset($_COOKIE[$name]); } } } }
-- 展开阅读全文 --