-
PHP 实现多服务器共享 SESSION 数据
代码实现,首先创建数据表,MySQL 的 SQL 语句如下:
- CREATE TABLE `sess` (
- `sesskey` varchar(32) NOT NULL default ”,
- `expiry` bigint(20) NOT NULL default ‘0′,
- `data` longtext NOT NULL,
- PRIMARY KEY (`sesskey`),
- KEY `expiry` (`expiry`)
- ) TYPE=MyISAM
sesskey 为 SESSION ID,expiry 为 SESSION 过期时间,data 用于保存 SESSION 数据,默认情况下 SESSION 数据是以文件方式保存,想要使用数据库方式保存,就必须重新定义 SESSION 各个操作的处理函数,PHP 提供了session_set_save_handle() 函数,可以用此函数自定义 SESSION 的处理过程,当然首先要先将 session.save_handler 改成 user,可在 PHP 中进行设置,代码如下:
<?php session_module_name(‘user‘); ?>
接下来着重讲一下 session_set_save_handle() 函数,此函数有六个参数:
session_set_save_handler(string open,string close,string read,string write,string destroy,string gc)
各个参数为各项操作的函数名,这些操作依次是:打开、关闭、读取、写入、销毁、垃圾回收,PHP 手册中有详细的例子,在这里我们使用 OO 的方式来实现这些操作,详细代码如下:
- <?php
- define(‘MY_SESS_TIME‘, 3600); //SESSION 生存时长
- //类定义
- class My_Sess
- {
- function init()
- {
- $domain = ‘.infor96.com‘;
- //不使用 GET/POST 变量方式
- ini_set(‘session.use_trans_sid‘, 0);
- //设置垃圾回收最大生存时间
- ini_set(‘session.gc_maxlifetime‘, MY_SESS_TIME);
- //使用 COOKIE 保存 SESSION ID 的方式
- ini_set(‘session.use_cookies‘, 1);
- ini_set(‘session.cookie_path‘, ‘/‘);
- //多主机共享保存 SESSION ID 的 COOKIE
- ini_set(‘session.cookie_domain‘, $domain);
- //将 session.save_handler 设置为 user,而不是默认的 files
- session_module_name(‘user‘);
- //定义 SESSION 各项操作所对应的方法名:
- session_set_save_handler(
- array(‘My_Sess‘, ‘open‘), //对应于静态方法 My_Sess::open(),下同。
- array(‘My_Sess‘, ‘close‘),
- array(‘My_Sess‘, ‘read‘),
- array(‘My_Sess‘, ‘write‘),
- array(‘My_Sess‘, ‘destroy‘),
- array(‘My_Sess‘, ‘gc‘)
- );
- } //end function
- function open($save_path, $session_name) {
- return true;
- } //end function
- function close() {
- global $MY_SESS_CONN;
- if ($MY_SESS_CONN) { //关闭数据库连接
- $MY_SESS_CONN->Close();
- }
- return true;
- } //end function
- function read($sesskey) {
- global $MY_SESS_CONN;
- $sql = ‘SELECT data FROM sess WHERE sesskey=‘ . $MY_SESS_CONN->qstr($sesskey) . ‘ AND expiry>=‘ . time();
- $rs =& $MY_SESS_CONN->Execute($sql);
- if ($rs) {
- if ($rs->EOF) {
- return ”;
- } else { //读取到对应于 SESSION ID 的 SESSION 数据
- $v = $rs->fields[0];
- $rs->Close();
- return $v;
- } //end if
- } //end if
- return ”;
- } //end function
- function write($sesskey, $data) {
- global $MY_SESS_CONN;
- $qkey = $MY_SESS_CONN->qstr($sesskey);
- $expiry = time() + My_SESS_TIME; //设置过期时间
- //写入 SESSION
- $arr = array(
- ‘sesskey‘ => $qkey,
- ‘expiry‘ => $expiry,
- ‘data‘ => $data);
- $MY_SESS_CONN->Replace(‘sess‘, $arr, ‘sesskey‘, $autoQuote = true);
- return true;
- } //end function
- function destroy($sesskey) {
- global $MY_SESS_CONN;
- $sql = ‘DELETE FROM sess WHERE sesskey=‘ . $MY_SESS_CONN->qstr($sesskey);
- $rs =& $MY_SESS_CONN->Execute($sql);
- return true;
- } //end function
- function gc($maxlifetime = null) {
- global $MY_SESS_CONN;
- $sql = ‘DELETE FROM sess WHERE expiry< ‘ . time();
- $MY_SESS_CONN->Execute($sql);
- //由于经常性的对表 sess 做删除操作,容易产生碎片,
- //所以在垃圾回收中对该表进行优化操作。
- $sql = ‘OPTIMIZE TABLE sess‘;
- $MY_SESS_CONN->Execute($sql);
- return true;
- } //end function
- } ///:~
- //使用 ADOdb 作为数据库抽象层。
- require_once(‘adodb/adodb.inc.php‘);
- //数据库配置项,可放入配置文件中(如:config.inc.php)。
- $db_type = ‘mysql‘;
- //开源代码phpfensi.com
- $db_host = ‘192.168.212.1‘;
- $db_user = ‘sess_user‘;
- $db_pass = ‘sess_pass‘;
- $db_name = ‘sess_db‘;
- //创建数据库连接,这是一个全局变量。
- $GLOBALS['MY_SESS_CONN'] =& ADONewConnection($db_type);
- $GLOBALS['MY_SESS_CONN']->Connect( $db_host, $db_user, $db_pass, $db_name);
- //初始化 SESSION 设置,必须在 session_start() 之前运行!!
- My_Sess::init();
- ?>
出处:http://www.phpfensi.com/php/20140828/4941.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式