分布式存储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代替 ...
随机推荐
- 怎样下载安装Firebug和使用Firebug
Firebug是基于火狐(FireFox)浏览器的一个插件,它的作用是给Web页面开发者一个很好的测试前端页面代码的工具.所以深受网页开发者或网页布局爱好者的喜爱.像我们用DIV+CSS和html所写 ...
- php的异步框架
swoole目前已被多家移动互联网.物联网.网络游戏.手机游戏企业使用,替代了C++.Java等复杂编程语言来实现网络服务器程序. 使用PHP+Swoole,开发效率可以大大提升.官方提供了基于swo ...
- EXTJS API
EXTJS API 链接: http://docs.sencha.com/extjs/5.0.0/ http://docs.sencha.com/extjs/4.2.2/ http://docs.se ...
- C# - Generic
定义泛型类 创建泛型类,在类定义中包含尖括号语法 class MyGenericClass<T> { ... } T可以是任意标识符,只要遵循通常的C#命名规则即可.泛型类可以在其定义中包 ...
- nodejs phantom add click event
page.evaluate( function() { // find element to send click to var element = document.querySelector( ' ...
- MapperScannerConfigurer(转)
转:http://blog.csdn.net/ranmudaofa/article/details/8508028 原文:http://www.cnblogs.com/daxin/p/3545040. ...
- having——至少被订购过两回的订单
此篇介绍having的用法 一.表:订单表,产品表 说明:订单表order ,包含prodectid 二.查询至少被订购过两回的订单 800x600 Normal 0 7.8 磅 0 2 false ...
- hibernate hql 大全
Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. ...
- POJ 1220 NUMBER BASE CONVERSION(较复杂的进制转换)
题目链接 题意 : 给你一个a进制的数串s,让你转化成b进制的输出. A = 10, B = 11, ..., Z = 35, a = 36, b = 37, ..., z = 61,0到9还是原来的 ...
- POJ2031Building a Space Station
http://poj.org/problem?id=2031 题意:你是空间站的一员,太空里有很多球形且体积不一的“小房间”,房间可能相距不近,也可能是接触或者甚至是重叠关系,所有的房间都必须相连,这 ...