0

0

解析php session_set_save_handler 函数的用法(mysql)_PHP教程

php中文网

php中文网

发布时间:2016-07-21 15:02:29

|

1134人浏览过

|

来源于php中文网

原创

复制代码 代码如下:

php
/*============================文件说明========================================
@filename:     session.class.php
@description:  数据库保存在线用户session,实现在线用户功能!
@notice:       session过期时间一个小时,因为我们的站点是使用cookie(有效时间是1小时)登录。                
        因此我们只记录用户登录的时间,而不是刷新一次更新一次                
        删除数据库中session记录的动作发生在用户超时后执行这个文件或正常退出(session_destory) 
@database:     database:sessions  field:sessionid(char32),uid(int10),last_visit(int10)
=============================================================================
*/
 class session {
     private $db;
     private $lasttime=3600;//超时时间:一个小时
      function session(&$db) {
         $this->db = &$db;
         session_module_name('user'); //session文件保存方式,这个是必须的!除非在Php.ini文件中设置了
         session_set_save_handler(
             array(&$this, 'open'), //在运行session_start()时执行
              array(&$this, 'close'), //在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完后被执行
             array(&$this, 'read'), //在运行session_start()时执行,因为在session_start时,会去read当前session数据
             array(&$this, 'write'), //此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行
              array(&$this, 'destroy'), //在运行session_destroy()时执行
              array(&$this, 'gc') //执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc
         );
         session_start(); //这也是必须的,打开session,必须在session_set_save_handler后面执行
     }
        function unserializes($data_value) {
         $vars = preg_split(
             '/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\|/',
             $data_value, -1, PREG_SPLIT_NO_EMPTY |
             PREG_SPLIT_DELIM_CAPTURE
         );
         for ($i = 0; isset($vars[$i]); $i++) {
             $result[$vars[$i++]] = unserialize($vars[$i]);
         }
         return $result;
     } 
     function open($path, $name) {
         return true;
     }
     function close() {
         $this->gc($this->lasttime);
         return true;
     }
    function read($SessionKey){
         $sql = "SELECT uid FROM sessions WHERE session_id = '".$SessionKey."' limit 1";
         $query =$this->db->query($sql);
         if($row=$this->db->fetch_array($query)){
           return $row['uid'];
         }else{
             return "";
         }
              }
     function write($SessionKey,$VArray) {
         require_once(MRoot.DIR_WS_CLASSES .'db_mysql_class.php');
        $db1=new DbCom();
       // make a connection to the database... now
        $db1->connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE);
        $db1->query("set names utf8");
        $this->db=$db1;
        $SessionArray = addslashes($VArray);
         $data=$this->unserializes($VArray);  
                          $sql0 = "SELECT uid FROM sessions WHERE session_id = '".$SessionKey."' limit 1";
         $query0 =$this->db->query($sql0);
         if($this->db->num_rows($query0)             if (isset($data['webid']) && !empty($data['webid'])) {
                $this->db->query("insert into `sessions` set `session_id` = '$SessionKey',uid='".$data['webid']."',last_visit='".time()."'");
             }   
                    return true;
         }else{
             /*$sql = "update `sessions` set ";
             if(isset($data['webid'])){
             $sql .= "uid = '".$data['webid']."', " ;
             }
             $sql.="`last_visit` = null "
                   . "where `session_id` = '$SessionKey'";
                               $this->db->query($sql); */
             return true;
         }   
     }
   function destroy($SessionKey) {
      $this->db->query("delete from `sessions` where `session_id` = '$SessionKey'");
      return true;
    }
    function gc($lifetime) {
        $this->db->query("delete from `sessions` where unix_timestamp(now()) -`last_visit` > '".$this->lasttime."'");
        return true;
    }
     }
 ?>

下面是php.ini中session的配置说明:
session.save_handler = "files"

 存储和检索与会话关联的数据的处理器名字。默认为文件("files")。
 如果想要使用自定义的处理器(如基于数据库的处理器),可用"user"。
 有一个使用PostgreSQL的处理器:http://sourceforge.net/projects/phpform-ext/

session.save_path = "/tmp"
 传递给存储处理器的参数。对于files处理器,此值是创建会话数据文件的路径。
 Windows下默认为临时文件夹路径。
 你可以使用"N[MODE]/path"这样模式定义该路径(N是一个整数)。
 N表示使用N层深度的子目录,而不是将所有数据文件都保存在一个目录下。
 [MODE]可选,必须使用8进制数,默认600(=384),表示每个目录下最多保存的会话文件数量。
 这是一个提高大量会话性能的好主意。
 注意0: "N[MODE]/path"两边的双引号不能省略。
 注意1: [MODE]并不会改写进程的umask。
 注意2: php不会自动创建这些文件夹结构。请使用ext/session目录下的mod_files.sh脚本创建。
 注意3: 如果该文件夹可以被不安全的用户访问(比如默认的"/tmp"),那么将会带来安全漏洞。
 注意4: 当N>0时自动垃圾回收将会失效,具体参见下面有关垃圾搜集的部分。

session.name = "phpsessid"
用在cookie里的会话id标识名,只能包含字母和数字。

session.auto_start = Off
 在客户访问任何页面时都自动初始化会话,默认禁止。
 因为类定义必须在会话启动之前被载入,所以若打开这个选项,你就不能在会话中存放对象。

session.serialize_handler = "php"
 用来序列化/解序列化数据的处理器,php是标准序列化/解序列化处理器。
 另外还可以使用"php_binary"。当启用了WDDX支持以后,将只能使用"wddx"。

session.gc_probability = 1
session.gc_divisor = 100
 定义在每次初始化会话时,启动垃圾回收程序的概率。
 这个收集概率计算公式如下:session.gc_probability/session.gc_divisor
 对会话页面访问越频繁,概率就应当越小。建议值为1/1000~5000。

session.gc_maxlifetime = 1440
 超过此参数所指的秒数后,保存的数据将被视为'垃圾'并由垃圾回收程序清理。
 判断标准是最后访问数据的时间(对于FAT文件系统是最后刷新数据的时间)。
 如果多个脚本共享同一个session.save_path目录但session.gc_maxlifetime不同,
 那么将以所有session.gc_maxlifetime指令中的最小值为准。
 如果使用多层子目录来存储数据文件,垃圾回收程序不会自动启动。
 你必须使用一个你自己编写的shell脚本、cron项或者其他办法来执行垃圾搜集。
 比如,下面的脚本相当于设置了"session.gc_maxlifetime=1440" (24分钟):
 cd /path/to/sessions find -cmin +24 | xargs rm

立即学习PHP免费学习笔记(深入)”;

session.referer_check =
 如果请求头中的"Referer"字段不包含此处指定的字符串则会话ID将被视为无效。
 注意:如果请求头中根本不存在"Referer"字段的话,会话ID将仍将被视为有效。
 默认为空,即不做检查(全部视为有效)。

session.entropy_file = "/dev/urandom"
 附加的用于创建会话ID的外部高熵值资源(文件),
 例如UNIX系统上的"/dev/random"或"/dev/urandom"

session.entropy_length = 0
 从高熵值资源中读取的字节数(建议值:16)。

session.use_cookies = On
 是否使用cookie在客户端保存会话ID

session.use_only_cookies = Off
 是否仅仅使用cookie在客户端保存会话ID
 打开这个选项可以避免使用URL传递会话带来的安全问题。
 但是禁用Cookie的客户端将使会话无法工作。

session.cookie_lifetime = 0
 传递会话ID的Cookie有效期(秒),0 表示仅在浏览器打开期间有效。

session.cookie_path = "/"
 传递会话ID的Cookie作用路径。

PHP5学习对象教程
PHP5学习对象教程

PHP5学习对象教程由美国人古曼兹、贝肯、瑞桑斯编著,简张桂翻译,电子工业出版社于2007年12月1日出版的关于PHP5应用程序的技术类图书。该书全面介绍了PHP 5中的新功能、编程方法及设计模式,还分析阐述了PHP 5中新的数据库连接处理、错误处理和XML处理等机制,帮助读者系统了解、熟练掌握和高效应用PHP。

下载

session.cookie_domain =
 传递会话ID的Cookie作用域。
 默认为空表示表示根据cookie规范生成的主机名。

session.cookie_secure = Off
 是否仅仅通过安全连接(https)发送cookie。

session.cookie_httponly = Off
 是否在cookie中添加httpOnly标志(仅允许HTTP协议访问),
 这将导致客户端脚本(JavaScript等)无法访问该cookie。
 打开该指令可以有效预防通过XSS攻击劫持会话ID。

session.cache_limiter = "nocache"
 设为{nocache|private|public}以指定会话页面的缓存控制模式,
 或者设为空以阻止在http应答头中发送禁用缓存的命令。

session.cache_expire = 180
 指定会话页面在客户端cache中的有效期限(分钟)
 session.cache_limiter=nocache时,此处设置无效。

session.use_trans_sid = Off
 是否使用明码在URL中显示SID(会话ID)。
 默认是禁止的,因为它会给你的用户带来安全危险:
 1- 用户可能将包含有效sid的URL通过email/irc/QQ/MSN…途径告诉给其他人。
 2- 包含有效sid的URL可能会被保存在公用电脑上。
 3- 用户可能保存带有固定不变sid的URL在他们的收藏夹或者浏览历史纪录里面。
 基于URL的会话管理总是比基于Cookie的会话管理有更多的风险,所以应当禁用。

session.bug_compat_42 = On
session.bug_compat_warn = On
 PHP4.2之前的版本有一个未注明的"BUG":
 即使在register_globals=Off的情况下也允许初始化全局session变量,
 如果你在PHP4.3之后的版本中使用这个特性,会显示一条警告。
 建议关闭该"BUG"并显示警告。

session.hash_function = 0
 生成SID的散列算法。SHA-1的安全性更高一些
 0: MD5 (128 bits)
 1: SHA-1 (160 bits)
 建议使用SHA-1。

session.hash_bits_per_character = 4
 指定在SID字符串中的每个字符内保存多少bit,
 这些二进制数是hash函数的运算结果。
 4: 0-9, a-f
 5: 0-9, a-v
 6: 0-9, a-z, A-Z, "-", ","
 建议值为 5

url_rewriter.tags = "a=href,area=href,frame=src,form=,fieldset="
 此指令属于PHP核心部分,并不属于Session模块。
 指定重写哪些HTML标签来包含SID(仅当session.use_trans_sid=On时有效)
 form和fieldset比较特殊:
 如果你包含他们,URL重写器将添加一个隐藏的"",它包含了本应当额外追加到URL上的信息。
 如果要符合XHTML标准,请去掉form项并在表单字段前后加上

标记。
 注意:所有合法的项都需要一个等号(即使后面没有值)。
 推荐值为"a=href,area=href,frame=src,input=src,form=fakeentry"。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/327928.htmlTechArticle复制代码 代码如下: ?php /*============================文件说明======================================== @filename: session.class.php @description: 数据库保存在线用...

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

2

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

80

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

187

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

339

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

116

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

180

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

31

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

81

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 6.1万人学习

R 教程
R 教程

共45课时 | 7.8万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号