PHP自定义session处理方法保存到MySQL数据库中

本篇内容介绍了“PHP自定义session处理方法保存到MySQL数据库中”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

专注于为中小企业提供成都网站制作、网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业临高免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了超过千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

解构session存储

在我们开始构建自己的session处理及存储方法之前,理解PHP默认如何存储session数据是很有帮助的。session数据被保存在服务器上一个很小的文件中,并关联了一个唯一的ID,随后被浏览器以cookie的形式保存在客户端。如果cookie没被起用,那么ID就会随着URL被当做参数进行传递。无论是哪种方式,在随后的请求中,PHP都是通过这个唯一的ID对session数据进行读取、更新或者删除等操作。为了便于理解这是怎么一回事,我们可以先从session数据保存的位置开始分析。对于文件形式保存的session数据,可以通过检查php.ini中的session.save_path得知,也可以用session_save_path()函数进行输出,如:

输出结果就是session数据保存的位置。如果你想更改存储位置,可以修改php.ini配置,或者执行session_save_path()函数,参数就是新的存储路径。

session_save_path("/path/to/session/data");

最佳实践:如果你自定义了session存储路径,那么建议把路径选择在网站根目录之外,这样可以最大限度避免非法获取session数据。当然,你需要保证PHP程序能够正常读写session文件。

现在我们已经知道了session数据存储在哪,那我们就很容易找到对应当前访问的session文件。session文件的命名以“sess_”为前缀,加上唯一的ID。session_id()可以获取唯一ID值(是32位的字符串)。文件内容是以类似serialize()函数编码的方式处理过的数据。

提醒:无论session是保存在默认路径,还是自定义路径或数据库中,内容都是一样的。我们能改变的是存储位置,而不是存储的内容。

session的生命周期

所有的session从session_start()开始,session文件被打开,数据已数组的形势保存在$_SESSION变量中。当脚本执行完成之后,数据又被重新保存到session文件中。所以,当你设置了一个session值的时候,它并不是马上就会进行存储的。但是,你可以通过执行session_write_close()函数强制进行session数据的保存。

session_set_save_handler() 函数提供了自定义session数据存储的机制。它需要个参数,每个参数都是一个可回调的函数,对应了session生命周期的每个阶段:

  1. 打开session文件open

  2. 关闭session文件close

  3. 读取session数据read

  4. 写入session数据write

  5. 销毁session destroy

  6. 垃圾回收 gc

PHP5.4之后,可以只传递两个参数,第一个参数是实现了SessionHandlerInterface接口的对象,第二个参数控制是否将函数 session_write_close() 注册为 register_shutdown_function() 函数。

自定义session处理:存储到MySQL数据库

创建存储表
CREATE TABLE `hb_session` (
 `id` char(32) NOT NULL,
 `data` text NOT NULL,
 `access` int(11) unsigned NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Session类
namespace core\basic;

use core\database\DB;

class Session implements \SessionHandlerInterface
{
    public function open($save_path, $session_name)
    {
        return true;
    }

    public function close()
    {
        return true;
    }

    public function read($session_id)
    {
        $data = DB::fetch_first("select data from `" . DB::table('session') . "` where id='{$session_id}'");
        // 此处返回很重要,要么为空字符串,要么为实际数据。如果是NULL,则session保存会失败
        return empty($data['data']) ? '' : $data['data'];
    }

    public function write($session_id, $data)
    {
        $now = time();
        $session = DB::fetch_first("select data from `" . DB::table('session') . "` where id='{$session_id}'");
        if (count($session) > 0) {
            DB::update("session", array(
                'data' => $data,
                'access' => $now
            ), "id='{$session_id}'");
        } else {
            DB::insert("session", array(
                'id' => $session_id,
                'data' => $data,
                'access' => $now
            ));
        }

        DB::affected_rows() ? true : false;
    }

    public function destroy($session_id)
    {
        DB::delete("session", "id='{$session_id}'");
        return true;
    }

    public function gc($lifetime)
    {
        $subtime = time() - $lifetime;
        DB::delete("session", "access<{$subtime}");
        return true;
    }
}

重要:请自行更改数据库操作方式。以上代码只在我自己的环境中可运行。

起用新session处理方式
$handler = new Session();
session_set_save_handler($handler, true);
session_start();

“PHP自定义session处理方法保存到MySQL数据库中”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


本文名称:PHP自定义session处理方法保存到MySQL数据库中
网页链接:http://myzitong.com/article/jdocsh.html