2014-09-05
描述
在PHP中可以通过定义session_set_save_handler,将服务器session数据存储在不同的介质上,比如存储在文件里,apc或memcache缓存中,或存储在数据库里。可对统计在线人数,或踢除特定会员的登陆状态等等。
自定义session_set_save_handler,基本上就是使用自定义的读写方法覆盖了系统默认的session的读写方法,以实现对session的管理。欢迎大家一起交流,有什么疑问请写信给我。
工厂类
[php]
<?php
/**
* CHttpSession
* http session 数据存储引擎
*/
class CHttpSession {
private static $engine;
private static $gc_maxlifetime;
public static function engine( $enginer ) {
$enginer = ucfirst( $enginer );
$engineInstance = "CHttpSession{$enginer}";
$filename = SYS_MODULE . '/Session/' . $engineInstance . '.php';
if ( !file_exists( $filename )) {
throw new Exception( 'Fatal: not found {$filename} file' );
}
require( $filename );
if ( !class_exists( $engineInstance ) ) {
throw new Exception( 'Fatal: not found {$engineInstance} object' );
}
$handler = new CHttpSession( new $engineInstance );
ini_set( "session.save_handler", "user" );
ini_set( 'apc.ttl', 3600 );
ini_set( 'apc.user_ttl', 1200 );
ini_set( 'apc.gc_ttl', 3600 );
session_set_save_handler(
array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
array($handler, 'gc')
);
if ( isset( $_COOKIE['PHPSESSID'] ) ) {
session_start( $_COOKIE['PHPSESSID'] );
}
else {
session_start( );
setcookie( 'PHPSESSID', session_id(), null, '/', COOKIE_DOMAIN );
}
}
public function __construct( & $engine ) {
self::$engine = $engine;
self::$gc_maxlifetime = ini_get( 'session.gc_maxlifetime' );
}
public function read( $id ) {
return self::$engine->fetch( 'session/'.$id );
}
public function write ( $id , $data ) {
return self::$engine->add( 'session/'.$id, $data, self::$gc_maxlifetime );
}
public function close ( ) {
return true;
}
public function destroy ( $id ) {
return self::$engine->delete( 'session/'.$id );
}
public function __destruct ( ) {
session_write_close();
}
public function gc ( $maxlifetime ) {
return true;
}
public function open ( $save_path , $session_name ) {
return true;
}
};
具体方法
CHttpSessionFile
[php]
<?php
/**
* CFileHttpSession
* session引擎, 以文件的方式对session进行存储, YPi框架默认session存储引擎
* SESSION_DIR 设置session文件存储路径
*/
class CHttpSessionFile {
public function add( $key, $data, $cg_maxlifetime ) {
$filepath = substr( $key, 7 );
file_put_contents( SESSION_DIR.$filepath, $data );
return true;
}
public function fetch( $key ) {
$filepath = substr( $key, 7 );
if ( !file_exists(SESSION_DIR.$filepath) ) {
file_put_contents( SESSION_DIR.$filepath, '' );
return true;
}
return file_get_contents( SESSION_DIR.$filepath );
}
public function delete( $key ) {
$filepath = substr( $key, 7 );
if ( file_exists( SESSION_DIR.$filepath ) ) {
unlink( SESSION_DIR.$filepath );
}
return true;
}
};
CHttpSessionApc
[php]
<?php
/**
* CApcHttpSession
* session引擎, 以APC缓存的方式对session进行存储
* SESSION_ENGINE 设置值为apc,以启用APC方式对session进行存储
*/
class CHttpSessionApc {
public function add( $key, $data, $cg_maxlifetime ) {
apc_store( $key, $data, $cg_maxlifetime );
return true;
}
public function fetch( $key ) {
if ( !apc_exists( $key ) ) {
apc_store( $key, '' );
return true;
}
return apc_fetch( $key );
}
public function delete( $key ) {
if ( apc_exists( $key ) ) {
apc_delete( $key );
}
return true;
}
};
CHttpSessionMemcache
[php]
<?php
/**
* CMemcacheHttpSession
* session引擎, 以memcache缓存的方式对session进行存储 *
* SESSION_ENGINE 设置值为memcache,以启用memcache方式对session进行存储
* MEMCACHE_HOST 设置memcache服务器地址
* MEMCACHE_PORT 设置memcache服务器访问端口号
*/
class CHttpSessionMemcache {
private static $memcache;
public function __constrct( $config ) {
self::$memcache = new Memcache;
self::$memcache->connect( MEMCACHE_HOST, MEMCACHE_PORT );
}
public function __destroy() {
self::$memcache->close();
}
public function add( $key, $data, $cg_maxlifetime ) {
return self::$memcache->add( $key, $data, $cg_maxlifetime );
}
public function fetch( $key ) {
return self::$memcache->get( $key );
}
public function delete( $key ) {
return self::$memcache->delete( $key );
}
};
实例说明
只需要把平时用的 session_start() 替换成以下的方法即可。
[php]
<?php
defined('SESSION_ENGINE')||define('SESSION_ENGINE', 'file');
require '../lib/CHttpSession.php';
CHttpSession::engine( SESSION_ENGINE );
摘自 yagas的专栏
1
CI框架连接数据库配置操作以及多数据库操作
09-05
2
asp 简单读取数据表并列出来 ASP如何快速从数据库读取大量数据
05-17
3
C语言关键字及其解释介绍 C语言32个关键字详解
04-05
4
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解
04-26
5
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
09-05
6
将视频设置为Android手机开机动画的教程
12-11
7
PHP中的(++i)前缀自增 和 (i++)后缀自增
09-05
8
常用dos命令及语法
09-27
PHP中include和require区别之我见
2014-09-05
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
2017-04-12
php递归返回值的问题
2014-09-05
如何安装PHPstorm并配置方法教程 phpstorm安装后要进行哪些配置
2017-05-03
单片机编程好学吗?单片机初学者怎样看懂代码
2022-03-21
PHP 教程之如何使用BLOB存取图片信息实例
2014-09-05
零基础的初学者怎样学习java,或者应该先学什么?
2022-03-21
学ug编程如何快速入门?
2022-03-17
PHP数组函数array
2014-09-05
学习使用C语言/C++编程的7个步骤!超赞~
2022-03-20
球球大作战汉化版下载v19.7.1 安卓版
其它手游 170.54MB
下载
葫芦侠三楼最新破解版下载v4.4.0.6 安卓版
其它手游 34.82MB
下载
葫芦侠7楼破解版免费下载v4.4.0.6安卓最新版
其它手游 34.82MB
下载
葫芦侠八楼免费版下载v4.4.0.6安卓版
其它手游 34.82MB
下载
葫芦侠3楼破解版免费下载v4.4.0.6安卓手机版
其它手游 34.82MB
下载
像素漫斗抱歉,“八神庵”是特指游戏角色的专有名词,不存在符合要求的常用同义词近义词。下载v1.00安卓版
其它手游 206.87MB
下载
葫芦侠4楼破解版游戏修改器下载v4.4.0.6安卓免费版
其它手游 34.82MB
下载
末日餐厅安卓版下载v1.35安卓版
其它手游 73.98MB
下载葫芦侠十楼免费破解版下载v4.4.0.6安卓版
下载
葫芦侠8楼最新破解版下载v4.4.0.6安卓版
下载
猫娘乐园世界连结正版下载v1.9.1 安卓版
下载
像素漫斗全员下载v1.00安卓版
下载
葫芦侠8楼手机版下载v4.4.0.6安卓版
下载
末日餐厅正版官网入口下载v1.35安卓版
下载
我的汉克狗正版下载v26.4.1.48473 安卓版
下载
像素漫斗u鼬神最新版本下载v1.00安卓版
下载