登录  /  注册

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

php中文网
发布: 2016-07-13 17:51:19
原创
1160人浏览过

描述

在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 ); 

 


摘自 yagas的专栏

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/478213.htmlTechArticle描述 在PHP中可以通过定义session_set_save_handler,将服务器session数据存储在不同的介质上,比如存储在文件里,apc或memcache缓存中,或存储在数...
智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号