【Session】Session缓存Mysql数据库版

沉梦小哥哥
预计阅读时长 32 分钟
位置: 首页 php笔记 正文

通过用户反馈服务器在使用时,如果网站过多或者并发过大,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]);
            }
        }

    }
}



-- 展开阅读全文 --
头像
【emlog插件】emlog博客程序富文本编辑器插件CmEditor!支持图片上传
« 上一篇 2022-04-27
【vue笔记】运行npm install or npm update 报错 path git errno -4058
下一篇 » 2022-06-08
取消
微信二维码
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]