分布式存储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代替 ...
随机推荐
- Python OS模块标准库的系统接口及操作方法
Python OS模块标准库的系统接口及操作方法 os.name 返回当前操作系统名,定义了'posix','nt','mac','os2','ce','java'(我使用win7/python3.1 ...
- poj 2774 Long Long Message 后缀数组LCP理解
题目链接 题意:给两个长度不超过1e5的字符串,问两个字符串的连续公共子串最大长度为多少? 思路:两个字符串连接之后直接后缀数组+LCP,在height中找出max同时满足一左一右即可: #inclu ...
- if...else..的错误用法
1.最近在写js代码完成一个前段DOM操作的函数时,自己错误的使用了if..else..控制体.为什么是错误的呢?看看我的 代码你就明白了: document.getElementsByClassNa ...
- Fedora 命令
1. 更新包 yum clear all yum -y update 2.yum包查找 yum whatprovides xxxx.os.l 3 df 查看磁盘空间 xclip 复制到粘贴板 xcli ...
- Device eth0 does not seem to be present
解决办法: 首先,打开/etc/udev/rules.d/70-persistent-net.rules内容如下面例子所示: # vi /etc/udev/rules.d/70-persistent- ...
- hive-site.xml 参数设置
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="confi ...
- div蒙版+可移动
<html> <head> <title></title> <script src="jquery-1.8.2.js&q ...
- poj 2226 Muddy Fields (转化成二分图的最小覆盖)
http://poj.org/problem?id=2226 Muddy Fields Time Limit: 1000MS Memory Limit: 65536K Total Submissi ...
- poj 3463 Sightseeing( 最短路与次短路)
http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS Memory Limit: 65536K Total Submissio ...
- MySQL中字符串函数详细介绍
MySQL字符串函数对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str)返回字符串str的 最左面字符的ASCII代码值.如果str是空字符串, 返回0.如果str是NULL,返回N ...