PHP自定义session处理方法,保存到MySQL数据库中
我们都知道,session是为了解决因特网的无状态属性而创造出来的。我们可以用session这种会话管理机制来构建购物车、监控站点网络访问,甚至还可以跟踪某一个用户具体是如何使用你的应用的。PHP默认的session处理行为已经能应付大部分的场景,但有时候我们还是希望能够主动一点来控制session的处理方式,比如存储到数据库中而不是文件系统。下面我将以保存session到MySQL数据库给大家讲解如何自定义session处理方法。
解构session存储
在我们开始构建自己的session处理及存储方法之前,理解PHP默认如何存储session数据是很有帮助的。session数据被保存在服务器上一个很小的文件中,并关联了一个唯一的ID,随后被浏览器以cookie的形式保存在客户端。如果cookie没被起用,那么ID就会随着URL被当做参数进行传递。无论是哪种方式,在随后的请求中,PHP都是通过这个唯一的ID对session数据进行读取、更新或者删除等操作。为了便于理解这是怎么一回事,我们可以先从session数据保存的位置开始分析。对于文件形式保存的session数据,可以通过检查php.ini
中的session.save_path
得知,也可以用session_save_path()
函数进行输出,如:
<?php echo 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()
1000
函数提供了自定义session数据存储的机制。它需要六个参数,每个参数都是一个可回调的函数,对应了session生命周期的每个阶段:
- 打开session文件
open
- 关闭session文件
close
- 读取session数据
read
- 写入session数据
write
- 销毁session
destroy
- 垃圾回收
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处理函数来操作session,而不使用php预置的方法
- kphp框架中实现自定义session会话处理方法的php和msyql代码分享
- PHP实现利用MySQL保存session的方法
- php自定文件保存session的方法
- php将图片保存到mysql数据库及从数据库中读取图片的方法源码 转
- php的session可以自定义处理机制哦
- php自定文件保存session的方法
- php使用MySQL保存session会话的方法
- php session自定义处理
- php将图片保存到mysql数据库及从数据库中读取图片的方法源码
- php中将一个对象保存到Session中的方法
- PHP保存session到memcache服务器的方法
- php将图片保存到mysql数据库及从数据库中读取图片的方法源码
- PHP自定义错误处理的方法分析
- PHP保存session到memcache服务器的方法
- php APC 造成的session无法保存bug及解决方法
- PHP自定session保存路径及删除、注销与写入的方法
- php中将一个对象保存到Session中的方法
- php将图片保存到mysql数据库及从数据库中读取图片的方法源码
- PHP中的错误处理&自定义错误处理方法