自定义 Session 数据保存

当项目访问量大的时候,我们就不能采取php默认session存储方式了(php默认为文件存储),这个时候我们就要自己实现session数据存储。好在php提供了重写session数据的接口给我们。下面就是简单的用mysql存储session数据案例。

<?php
/**
 * @Author: Aaron
 * @Last Modified by:   Aaron
 */

class MysqlSessionHandle implements SessionHandlerInterface
{
    protected $_pdo = null;

    public function close()
    {
        $this->_pdo = null;
    }

    public function destroy($sessionID)
    {
        $sql = "delete from session where id = :sessionID";
        $stm = $this->_pdo->prepare($sql);
        $stm->bindParam(':sessionID',$sessionID,PDO::PARAM_STR,strlen($sessionID));
        $stm->execute();
    }

    public function gc($maxlifetime)
    {
        $sql = "delete from session where createTime < :maxlifetime";
        $stm = $this->_pdo->prepare($sql);
        @$stm->bindParam(':maxlifetime',$maxlifetime,PDO::PARAM_INT);
        $stm->execute();
    }

    public function open($savePath,$sessionName)
    {
        $dsn = 'mysql:dbname=test;host=127.0.0.1';
        $user = 'root';
        $password = 123456;
        try {
            $this->_pdo = new PDO($dsn,$user,$password);
        } catch (\Exception $e) {
            // 连接异常 可以在次记录日志
        }
    }

    public function read($sessionID)
    {
        $sql = "select * from session where id = :sessionID";
        $sth = $this->_pdo->prepare($sql);
        $sth->bindParam(':sessionID',$sessionID,PDO::PARAM_STR,strlen($sessionID));
        $sth->execute();
        $result = $sth->fetch(PDO::FETCH_ASSOC);
        return $result['data'];
    }

    public function write($sessionID,$data)
    {
        $sql = 'select * from session where id = :sessionid';
        $sth = $this->_pdo->prepare($sql);
        $sth->bindParam(':sessionid',$sessionID,PDO::PARAM_STR,strlen($sessionID));
        $sth->execute();
        $result = $sth->fetchAll(PDO::FETCH_ASSOC);
        if (empty($result)) {
            $sql = "insert into session values(:sessionID , :data , :time)";
        }else{
            $sql = "update session set data = :data, createTime = :time where id = :sessionID";
        }
        $sth = $this->_pdo->prepare($sql);
        // 绑定参数值 并 设定参数类型
        $sth->bindParam(':sessionID',$sessionID,PDO::PARAM_STR,strlen($sessionID));
        @$sth->bindParam(':time',time());
        $sth->bindParam(':data',$data,PDO::PARAM_STR,strlen($data));
        $result = $sth->execute();
    }
}
$myse = new MysqlSessionHandle();
session_set_save_handler($myse,true);
session_start();
$_SESSION['name'] = 'Aaron';
$_SESSION['age'] = 27;
$_SESSION['profession'] = 'PHP工程师';

Aaron

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会