分布式存储Memcache替代Session方案
PHP自带的Session实际是在服务器中为每个客户建立独立的文件存放各自的信息。
在不做处理的情况下,很容易被客户端伪造。并且由于采用文件形式,所以存在着IO
读写的瓶颈。一般当用户在线达到1000左右时,就会出现访问速度明显下降的问题。
Memcache是应用层级的缓存,它将数据存储内存中。内存的访问速度是可想而知的。
PHP在使用Memcache之前,需要做两件事。
1.安装PHP的memcache扩展。
2.下载Memcache文件。
以上两步很简单,去Google一下就可以了。
下面是memcache.class.php文件中MemcacheSession类
memcache.class.php
<?php
define('PREFIX', 'god');
define('SESS_LEFETIME', 3600);
define('ZIP_FLAG', 0);
class MemcacheSession {
    static $Memcache;
    /* 构造函数
     * @param string @login_user
     * @param int @login_type
     * @param string $login_sess
     */
    public function __construct($config) {
        if (!class_exists('Memcache') || !function_exists('memcache_connect')) {
            exit("Can't load Memcache Extendstion");
        }
        $this->Memcache = new Memcache;
        if (!@$this->Memcache->connect($config['host'], $config['port'])) {
            exit('连接失败');
        }
        $this->setCookie();
        return TRUE;
    }
    /* 增加键值
     * return bool
     */
    public function add($key, $data='empty') {
        if (!$this->Memcache->add($key, $data, ZIP_FLAG, SESS_LEFETIME)) {
            exit("此键名已经被使用");
        }
    }
    /* uniqueID
     * return string
     */
    public function uniqueID() {
        return PREFIX . md5(uniqid(rand(), true)) . $_SERVER['REMOTE_ADDR'];
        ;
    }
    /* 读取数据
     * @param string
     * return string/array
     */
    public function get($key='') {
        if ($key == '')
            exit('键名不能为空');
        $wData = $this->Memcache->get($key);
        if (!$wData)
            return FALSE;
        return $wData;
    }
    /* 重写数据
     * @param string $key
     * @param string $data
     * @return bool
     */
    public function set($key, $data='') {
        $ret = $this->Memcache->set($key, $data, ZIP_FLAG, SESS_LEFETIME);
        if (TRUE != $ret) {
            exit("存储数据失败");
        }
    }
    /* 注销数据
     * @param string $key
     * return bool
     */
    public function memDestory($key) {
        $this->Memcache->set($key);
    }
    /* Cookie验证,建立客户端与服务器端同步键名
     * return bool
     */
    public function setCookie() {
        if (empty($_COOKIE['sessionID'])) {
            $sessionID = md5(uniqid(rand(), true)) . $_SERVER['REMOTE_ADDR'];
            setcookie('sessionID', $sessionID, time() + SESS_LEFETIME);
            $this->set(PREFIX . $sessionID, 'empty');
        } else {
            setcookie('sessionID', $_COOKIE['sessionID'], time() + SESS_LEFETIME);
            if (!$this->Memcache->get(PREFIX . $_COOKIE['sessionID']))
                exit('处理异常'); //出现此错误是因为客户端伪造sessionID
        }
    }
}
?>
下面是简单的测试使用
ceshi.php
<?php require_once "memcache.class.php";
$config['host'] = '127.0.0.1';
$config['port'] = 11211;
try {
$session = new MemcacheSession($config);
} catch (Exception $e) {
echo $e->getMessage();
}
$sessionID = PREFIX . $_COOKIE['sessionID'];
$data['userA'] = 1024;
$data['pointA'] = 100;
$data['introA'] = '你干嘛呢!干嘛呢!';
$session->set($sessionID, $data);
print_r($session->get($sessionID));
?>
这里仅仅是针对一台服务器的实现。
如果需要分布式存储只需在实例化类传递host时,进行一些扩展就可以实现了。
扩展方案:
1.地址轮询:假设有3台服务器A、B、C,那么当第一个用户访问时连接A,第二个访问时连接B,第三个访问时连接C,第四个访问时返回第一个重新开始计数,依次向下。
2.地址分配:设定三个段A:69.168.0.0-69.168.255.255;B:192.168.0.0-192.168.255.255;C:68.192.0.0-68.192.255.255
当用户访问时,根据IP给其分配对应的服务器。
这两种方法,各自有各自的优缺点。
地址轮询,可以很好的实现负载均衡。
地址分配,可以根据用户位置分配距离最近的服务器,从而提高访问速度。
分布式存储Memcache替代Session方案的更多相关文章
- 可扩容分布式session方案
		
分布式session有以下几种方案: 1. 基于nfs(net filesystem)的session共享 将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器i ...
 - 基于php使用memcache存储session的详解(转)
		
web服务器的php session都给memcached ,这样你不管分发器把 ip连接分给哪个web服务器都不会有问题了,配置方法很简单,就在php的配置文件内增加一条语句就可以了,不过前提你需要 ...
 - .NET实现多个不同有效时间Session方案思考
		
什么是Session?简单讲,Session是一种服务端用于保存每个客户端用户的状态信息的机制.客户端第一次访问时,服务端从分配一个空间专门存储该客户端的信息,后续访问时便可以直接获取或者更新状态信息 ...
 - memcache 存储session
		
php使用memcache存储session http://blog.csdn.net/weilee2009/article/details/7658260
 - java项目使用memcache实现session共享+session基础
		
本文章主要目的是配置session共享,为了巩固基础,捎带介绍了一些基础知识(网上搜索后觉得最全面的特引过来,节省时间),基础扎实的可以自动忽略. 基础篇: 1.了解java web中的session ...
 - memcached结合php以及memcache共享session
		
//安装php的memcache扩展 一.使用php自带的pecl安装程序 [root@localhost src]# /usr/local/php/bin/pecl install memcache ...
 - 使用memcache 存储session
		
session.save_handler = memcache //设置session的储存方式为memcache memcache.hash_strategy = "consistent& ...
 - Nginx+Tomcat+Memcache 实现session共享
		
Nginx + Tomcat + Memcache 实现session共享 1. Nginx 部署 1.上传源码包到服务器,解压安装 下载地址:http://nginx.org/en/download ...
 - PHP替代session的方法
		
PHP替代session的方法 服务器集群的时候 会发现session的问题 一般采用redis 来代替 用账号作为key 因为redis能主从 所以打算用替代session的方法1 cookie代替 ...
 
随机推荐
- 1078. Hashing (25)
			
时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The task of this problem is simp ...
 - android.support.v4.widget.DrawerLayout使用
			
activity_main.xml布局如下: <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas ...
 - IOS平台汉字转拼音方案
			
iOS/Mac OS X 汉字转拼音 网络流行的汉字转拼音方案是带一个拼音码表,速度快.其实Core Foundation也提供了一种方案,而且还带声调! NSMutableString *ms = ...
 - EXTJS 4.2 日期控件
			
{ xtype: "fieldcontainer", layout: "hbox", items: [{ fieldLabel: '开始时间', name: ' ...
 - EXTJS 4.2 资料 控件之隐藏显示setVisible、只读setDisabled
			
隐藏: form_Step3_1_left.form.findField('CPTypeId').setVisible(false); 显示: form_Step3_1_left.form.findF ...
 - 使用tolua++编译pkg,从而创建自定义类让Lua脚本使用
			
步骤一:首先自定义类(这里Himi自定义类名 “MySprite”) MySprite.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // // ...
 - Code for the Homework1
			
作业要求: http://www.cnblogs.com/bingc/p/4919692.html 代码(未使用Eigen): #include <iostream> #include & ...
 - Recommender Systems基于内容的推荐
			
基于内容的推荐的基本推荐思路是:用户喜欢幻想小说,这本书是幻想小说,则用户有可能喜欢这本小说 两方面要求:(1)知道用户的喜好:(2)知道物品的属性 基于内容的推荐相比协同过滤方法(个人观点):协同过 ...
 - C++开源跨平台类库集
			
在如下的库支持下,开发的系统可以很方便移植到当前大部分平台上运行而无需改动,只需在对应的平台下 用你喜欢的编译器 重新编译即可 经典的C++库 STLport-------SGI STL库的跨平台 ...
 - 1988-B. 有序集合
			
描述 在C++里,有一个神奇的东西,叫做STL,这里提供了很多简单好用的容器,用来实现常用又很难书写的数据结构,如栈(stack)等.其中,有一个容器叫set,译作“有序集合”.首先,这是一个集合,所 ...