session 文件同步

来源:互联网 发布:js 字符串寻找子串 编辑:程序博客网 时间:2024/06/07 18:24

PHP中的Session在默认情况下是使用客户端的Cookie来保存Session ID的,

所以当客户端的cookie出现问题的时候就会影响Session了。

但是session不依赖Cookie,只要把php.ini中的session.use_trans_sid设置为1

当客户端的Cookie被禁用或出现问题时,

PHP会自动把Session ID附着在URL中,

这样再通过Session ID就能不用cookie也可以使用Session变量了。

<?php// session_start();// $_SESSION['name'] = $_POST['username'];// echo session_id();// var_dump($_SESSION);die(); /* * 创建数据库 drop DATABASE if EXISTS session; create DATABASE session CHARSET utf8; use session; drop TABLE if EXISTS session; create table session ( sess_id char(32) UNIQUE NOT NULL, sess_info text, sess_expire int not null default 0 )CHARSET utf8 ENGINE INNODB; */ /** * sess_open回调函数类似于类的构造函数, 在会话打开的时候会被调用。这是自动开始会话或者通过调用 session_start() 手动开始会话之后第一个被调用的回调函数。 此回调函数操作成功返回TRUE,反之返回FALSE。 */ //session入库 //1. 开启session function sess_open(){ //连接mysql @mysql_connect('127.0.0.1','root','root'); mysql_query('set names utf8'); mysql_query('use session'); //查看当前调用了什么方法 echo __FUNCTION__.'<br/>'; } //sess_close 回调函数类似于类的析构函数。在 write 回调函数调用之后调用。当调用 session_write_close() 函数之后,也会调用 close 回调函数。 此回调函数操作成功返回TRUE,反之返回FALSE。 //2. 关闭session function sess_close(){ //关闭mysql mysql_close(); echo __FUNCTION__.'<br/>'; } /*如果会话中有数据,read 回调函数必须返回将会话数据编码(序列化)后的字符串。 如果会话中没有数据,read 回调函数返回空字符串。 在自动开始会话或者通过调用 session_start() 函数手动开始会话之后,PHP 内部调用 read 回调函数来获取会话数据。 在调用read之前,PHP会调用open回调函数。 read回调返回的序列化之后的字符串格式必须与 write 回调函数保存数据时的格式完全一致。 PHP会自动反序列化返回的字符串并填充 $_SESSION 超级全局变量。 虽然数据看起来和 serialize() 函数很相似,但是需要提醒的是,它们是不同的。 */ //3. 读取session function sess_read($sess_id){ //从数据库读取 //echo $sess_id; //这个sess_id,是系统自动生成的 //在读取数据的时候我们要过滤掉过期的数据 //通过当前时间与系统的session最大周期的差 $expire = time() - ini_get('seesion.gc_maxlifetime');//ini_get获取一个配置选项的值 $sql = "select * from session where sess_id = '$sess_id' and sess_expire >= '$expire'"; $res = mysql_query($sql); echo __FUNCTION__.'<br/>'; //得到一个数组 if($sess = mysql_fetch_assoc($res)){ return $sess['sess_info']; } } /* 在会话保存数据时会调用 write 回调函数。 此回调函数接收当前会话ID以及$_SESSION中数据序列化之后的字符串作为参数。 序列化会话数据的过程由 PHP 根据 session.serialize_handler 设定值来完成。 序列化后的数据将和会话 ID 关联在一起进行保存。 当调用 read 回调函数获取数据时, 所返回的数据必须要和传入write回调函数的数据完全保持一致。 PHP 会在脚本执行完毕或调用 session_write_close() 函数之后调用此回调函数。 注意,在调用完此回调函数之后,PHP 内部会调用 close 回调函数。 Note: PHP 会在输出流写入完毕并且关闭之后 才调用 write 回调函数, 所以在 write 回调函数中的调试信息不会输出到浏览器中。 如果需要在 write 回调函数中使用调试输出, 建议将调试输出写入到文件。 */ // 4.写入操作 function sess_write($sess_id,$sess_info){ //向数据库中写入session //echo $sess_id.$sess_info; $time = time(); $sql = "replace into session values('$sess_id','$sess_info','$time')";//使用replace主是要因为要重复修改seesion,而sess_id又是UNIQUE echo __FUNCTION__.'<br>'; return mysql_query($sql); } /* 当调用 session_destroy() 函数,或者调用 session_regenerate_id() 函数并且设置 destroy 参数为 TRUE 时, 会调用此回调函数。此回调函数操作成功返回 TRUE,反之返回 FALSE。 */ //5. 销毁 function sess_destroy($sess_id){ //删除数据库中信息 $sql = "delete from session where sess_id = '$sess_id'"; echo __FUNCTION__.'<br>'; return mysql_query($sql); } /* 为了清理会话中的旧数据,PHP会不时的调用垃圾收集回调函数。 调用周期由 session.gc_probability 和 session.gc_divisor 参数控制。 传入到此回调函数的 lifetime 参数由 session.gc_maxlifetime 设置。 此回调函数操作成功返回 TRUE,反之返回 FALSE。 */ //6.回收 function sess_gc(){ //删除过期的数据 $expire = time()-ini_get('session.gc_maxlifetime'); $sql = "delete from session where sess_expire < '$expire'"; echo __FUNCTION__.'<br/>'; } //修改session机制 session_set_save_handler('sess_open','sess_close','sess_read','sess_write','sess_destroy','sess_gc'); header("content-type:text/html;charset=utf-8"); //启动session session_start(); //加入session数据 $_SESSION['name'] = $_POST['username']; $_SESSION['age'] = $_POST['age']; //查看数据 // var_dump($_SESSION); //删除session // session_destroy();

0 0