[PHP] PHP Memcached 替换 系统$_SESSION Singee77原创文章

发表于:1个月前  阅读量:21095

摘要

Memcached 分布式存储系统,在日常开发过程中多用多于服务器单点登录以及均衡负载。

Memcache PHP 基础使用

$memcache_obj = memcache_connect(”localhost”, 11211);//Memcache默认端口11211
memcache_add($memcache_obj, ’var_key’, ’test variable’, false, 30);
$memcache_obj->add(’var_key’, ’test variable’, false, 30);

对于一个大型网站来说,这样写是不是比较麻烦?那我们能不能在不影响功能的前提下换一种开发方式?

PHPer在开发过程中一般用$_SESSION来存储一些会话信息,那么我们可不可以重写他呢、这样既不会去修改所有的源代码又可以很方便的进行开发呢?答案当然是可以的。

1、新建一个php文件命名为MemcacheSession.class.php

<?php
 
/**Memcache替换SESSION类
 * +---------------------------------
 * @Created by PHPSTORM.
 * @User: schh Singee77
 * Class MemcacheSession
 **+---------------------------------
 */
class MemcacheSession extends MemcachePool{
    //memcached服务器连接地址
     private $_MEMCACHEAUTH = array(
         'host' => 'localhost',
         'port' => 11211,
    );
 
    /*
    获取一些初始化设置值
    */
    private $_SESSION_NAME = 'MEM'; //sessionid的名称 默认PHPSESSID
    private $_SESSION_TIME = 0; //sessionid这个cookie的最大保存时间
    private $_SESSION_EXPIRE = 86400; //session键值对在memcached里面的过期时间
    private $_SESSION_MEMKEY = ""; //sessionid值
    /*
    自定义的_session_start()方法,替换PHP的原生session_start()方法
    逻辑应该是比较清楚的
    */
    function _session_start()
    {
        //开启Memcache服务
        parent::connect($this->_MEMCACHEAUTH['host'],$this->_MEMCACHEAUTH['port']);
        //获取COOKIE值(KEY值)不存在则设置  存在则根据KEY值获取该内存下的内容
        if ( empty($_COOKIE[$this->_SESSION_NAME]) )
        {
            $_SESSION_MEMKEY = md5( uniqid() ); //唯一的KEY
            setcookie($this->_SESSION_NAME, $_SESSION_MEMKEY , $this->_SESSION_TIME, "/",'.cwddd.com');
            $_SESSION = array();
        }
        else
        {
            //获取COOKIE
            $_SESSION_MEMKEY = $_COOKIE[$this->_SESSION_NAME];
 
            //获取该KEY值下的值
            $_SESSION = parent::get($_SESSION_MEMKEY);
            if ( $_SESSION === FALSE )
            {
                $_SESSION = array();
            }
        }
        $this->_SESSION_MEMKEY = $_SESSION_MEMKEY;
        //注册一个handler,这个函数会在页面执行完的时候执行
        register_shutdown_function(array($this, "_session_save_handler"));
    }
    /*
    页面最后执行的方法,用于保存session值,以及关闭memcached连接
    */
    function _session_save_handler()
    {
        //执行完毕把当前SESSION值存入内存
        parent::set($this->_SESSION_MEMKEY,$_SESSION,0,$this->_SESSION_EXPIRE);
        parent::close();
    }
 
    //清空当前内存
    function _destroy(){
        parent::delete($_COOKIE[$this->_SESSION_NAME]);
    }
}
 
$mem = new MemcacheSession();
 
//自动开启MEM
$mem->_session_start();

//End
?>

本人使用的是ThinkPHP框架测试,所以只要在入口文件index.php引入

2、新建 index.php

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
 
// 应用入口文件
 
// 检测PHP环境
if(version_compare(PHP_VERSION,'5.3.0','<'))  die('require PHP > 5.3.0 !');
 
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',True);
 
// 定义应用目录
define('APP_PATH','./Application/');
 
define('BIND_MODULE','Home');
 
//入口Memcache替换SESSION
require './Memcache/MemcacheSession.class.php';
 
// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';
 
// 亲^_^ 后面不需要任何代码了 就是如此简单

3、创建测试控制器 TestContoller.class.php

<?php
/**++++++++++++++++++++++++++++++++++++++
 * @Created by PhpStorm.
 * @User: schh Singee77
 **++++++++++++++++++++++++++++++++++++++
 */
 
namespace Home\Controller;
use Think\Controller;
class TestController extends Controller{
    function Iset(){
        set_time_limit(0);
        for($i=0;$i<50000000;$i++){
            $_SESSION['a'.$i] = array('status'=>array(1=>2),'tudde'=>array('1-2'));<br>    }      
    }
 
    function Iget(){
        print_r(session());
    }
}

注意:

1、首先得安装Memcache服务,网上下载很多。内容默认使用64M,修改内存大小Windows下可直接修改注册表。通过stats可以查看当前Memcache详情。

2、修改php.ini打开memcache.dll。


渝ICP备16002246号 Copyright © 2017. Singee77.com