php 深入理解session_set_save_handler执行机制

2024-05-14 18:18

本文主要是介绍php 深入理解session_set_save_handler执行机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

session handler默认启动顺序是session_start分别调用的回调函数。为open read ,然后等待脚本结束,收集$_SESSION(默认在内存中),然后关闭脚本,然后执行write,写入文件,然后close。

如何改变session handler默认启动顺序呢?

我们可以使用 session_commit(); 或者 session_write_close();函数调用的时候,session的机制就改变了,直接写入文件,关闭文件。然后再执行脚本。

 

下面来看一下PHP 使用 session_set_save_handler() 对 Session 进行自定义处理

/*
Session open (called by session_start( ))
Session close (called at page end)
Session read (called after session_start( ) )
Session write (called when session data is to be written)
Session destroy (called by session_destroy( ) )
Session garbage collect (called randomly)
*/
<?function sess_open($sess_path, $sess_name) {print "Session opened.\n";print "Sess_path: $sess_path\n";print "Sess_name: $sess_name\n\n";return true;}function sess_close( ) {print "Session closed.\n";return true;}function sess_read($sess_id) {print "Session read.\n";print "Sess_ID: $sess_id\n";return '';}/* http://www.manongjc.com/article/1293.html */function sess_write($sess_id, $data) {print "Session value written.\n";print "Sess_ID: $sess_id\n";print "Data: $data\n\n";return true;}function sess_destroy($sess_id) {print "Session destroy called.\n";return true;}function sess_gc($sess_maxlifetime) {print "Session garbage collection called.\n";print "Sess_maxlifetime: $sess_maxlifetime\n";return true;}session_set_save_handler("sess_open", "sess_close", "sess_read","sess_write", "sess_destroy", "sess_gc");session_start( );$_SESSION['foo'] = "bar";print "Some text\n";$_SESSION['baz'] = "wombat";
?>
1. 返回值的问题,为什么每个回调函数都有个retrun 的bool值?
2. 返回值的问题,比如read函数  返回一个false 会怎么样?true又怎么样
1. 返回值的问题,为什么每个回调函数都有个retrun 的bool值? Return Values Returns TRUE on success or FALSE on failure. 这个是函数的定义值。如果你不想用,可以不用catch他。 如果需要,这样写 A = session_set_save_handler() 返回值的问题,比如read函数 返回一个false 会怎么样?true又怎么样? 你可以结合IF来使用 比如 IF(session_set_save_handler()) 意思就是如果函数真.... 



session_set_save_handler---设置用户级 session 存储函数

函数原型 

void session_set_save_handler (string open, string close, string read, string write, string destroy, string gc)

session_set_save_handler() 设置用户级 session 存储函数,用于存储和取回 session 相关的数据. 用于那些使用不同于 PHP Session 指定的存储方式的情况. 例如,在本地数据库存储 session 数据. 

注意: 你必须设置 php.ini 里面的 session.save_handler配置参数来让 session_set_save_handler() 正常工作. 

下面的例子提供了类似于 PHP 默认的保存文件句柄的基于文件的 session storage 方式. 这个例子可以很简单的扩展到使用熟悉的数据库引擎来进行数据库存储. 
例子:

程序代码:[session_inc.php]

<?php 
$SESS_DBHOST = "yourhost"; /* database server hostname */ 
$SESS_DBNAME = "yourdb"; /* database name */ 
$SESS_DBUSER = "youruser"; /* database user */ 
$SESS_DBPASS = "yourpassword"; /* database password */ $SESS_DBH = ""; 
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime"); function sess_open($save_path, $session_name) { global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH; if (! $SESS_DBH = mysqli_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS,$SESS_DBNAME)) { echo "<li>Can't connect to $SESS_DBHOST as $SESS_DBUSER"; echo "<li>MySQL Error: " . mysql_error(); die; } return true; 
} function sess_close() { global $SESS_DBH;return mysqli_close($SESS_DBH); 
} function sess_read($key) { global $SESS_DBH, $SESS_LIFE; $qry = "SELECT value FROM session_tbl WHERE sesskey = '$key' AND expiry > " . time(); $qid = mysqli_query($SESS_DBH,$qry); if (list($value) = mysqli_fetch_array($qid,MYSQLI_NUM)) { return $value; } return false; 
} function sess_write($key, $val) { global $SESS_DBH, $SESS_LIFE; $expiry = time() + $SESS_LIFE; //过期时间 $value = addslashes($val); $qry = "INSERT INTO session_tbl VALUES ('$key', $expiry, '$value')"; $qid = mysqli_query($SESS_DBH,$qry); if (! $qid) { $qry = "UPDATE session_tbl SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " . time(); $qid = mysqli_query($SESS_DBH,$qry); } return $qid; 
} function sess_destroy($key) { global $SESS_DBH; $qry = "DELETE FROM session_tbl WHERE sesskey = '$key'"; $qid = mysqli_query($SESS_DBH,$qry); return $qid; 
} function sess_gc($maxlifetime) { global $SESS_DBH; $qry = "DELETE FROM session_tbl WHERE expiry < " . time(); $qid = mysqli_query($SESS_DBH,$qry); return true; 
} session_set_save_handler( 
"sess_open", 
"sess_close", 
"sess_read", 
"sess_write", 
"sess_destroy", 
"sess_gc"); session_start(); 
?>

完成以上步骤后,在程序中使用require("session_inc.php")来代替session_start()即可,其他的session函数还是象以前一样的方法调用

原文地址http://www.manongjc.com/article/1293.html

这篇关于php 深入理解session_set_save_handler执行机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/989489

相关文章

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

Redis的持久化之RDB和AOF机制详解

《Redis的持久化之RDB和AOF机制详解》:本文主要介绍Redis的持久化之RDB和AOF机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述RDB(Redis Database)核心原理触发方式手动触发自动触发AOF(Append-Only File)核

shell中set -u、set -x、set -e的使用

《shell中set-u、set-x、set-e的使用》本文主要介绍了shell中set-u、set-x、set-e的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录✅ 1. set -u:防止使用未定义变量 作用: 示例:❌ 报错示例输出:✅ 推荐使用场景:✅ 2. se

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基