在PHP中自定义session的存储方式

本文介绍如何通过自定义session_set_save_handler在PHP中实现Session数据的多种存储方式,包括文件、APC缓存及Memcache缓存等。通过具体代码示例展示了不同存储引擎的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

在PHP中可以通过定义session_set_save_handler,将服务器session数据存储在不同的介质上,比如存储在文件里,apc或memcache缓存中,或存储在数据库里。可对统计在线人数,或踢除特定会员的登陆状态等等。

自定义session_set_save_handler,基本上就是使用自定义的读写方法覆盖了系统默认的session的读写方法,以实现对session的管理。欢迎大家一起交流,有什么疑问请写信给我。给我写信


工厂类

<?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

/**
 * 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

/**
 * 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

/**
 * 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

defined('SESSION_ENGINE')||define('SESSION_ENGINE', 'file');
require '../lib/CHttpSession.php';

CHttpSession::engine( SESSION_ENGINE );


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yagas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值