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方案的更多相关文章

  1. 可扩容分布式session方案

    分布式session有以下几种方案: 1. 基于nfs(net filesystem)的session共享 将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器i ...

  2. 基于php使用memcache存储session的详解(转)

    web服务器的php session都给memcached ,这样你不管分发器把 ip连接分给哪个web服务器都不会有问题了,配置方法很简单,就在php的配置文件内增加一条语句就可以了,不过前提你需要 ...

  3. .NET实现多个不同有效时间Session方案思考

    什么是Session?简单讲,Session是一种服务端用于保存每个客户端用户的状态信息的机制.客户端第一次访问时,服务端从分配一个空间专门存储该客户端的信息,后续访问时便可以直接获取或者更新状态信息 ...

  4. memcache 存储session

    php使用memcache存储session   http://blog.csdn.net/weilee2009/article/details/7658260

  5. java项目使用memcache实现session共享+session基础

    本文章主要目的是配置session共享,为了巩固基础,捎带介绍了一些基础知识(网上搜索后觉得最全面的特引过来,节省时间),基础扎实的可以自动忽略. 基础篇: 1.了解java web中的session ...

  6. memcached结合php以及memcache共享session

    //安装php的memcache扩展 一.使用php自带的pecl安装程序 [root@localhost src]# /usr/local/php/bin/pecl install memcache ...

  7. 使用memcache 存储session

    session.save_handler = memcache //设置session的储存方式为memcache memcache.hash_strategy = "consistent& ...

  8. Nginx+Tomcat+Memcache 实现session共享

    Nginx + Tomcat + Memcache 实现session共享 1. Nginx 部署 1.上传源码包到服务器,解压安装 下载地址:http://nginx.org/en/download ...

  9. PHP替代session的方法

    PHP替代session的方法 服务器集群的时候 会发现session的问题 一般采用redis 来代替 用账号作为key 因为redis能主从 所以打算用替代session的方法1 cookie代替 ...

随机推荐

  1. python安装与环境变量配置

    默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册python环境变量:假设python的安装 ...

  2. django1.6之template基础用法

    >>> settings.configure()>>> tem=template.Template("my template is {{name}}&qu ...

  3. RecursiveDirectoryIterator目录操作类

    /** * @author Funsion Wu * @abstract SPL使用案例,全国首发,技术分享,欢迎转帖 */ class Dir extends RecursiveDirectoryI ...

  4. Java 多线程 简单实例 (Thread)

    package second; public class A extends Thread { public void run(){ for(int i = 1;i <= 10 ; i++){ ...

  5. 【BZOJ 1497】 [NOI2006]最大获利

    Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一 ...

  6. EF当实体模型与数据库的架构不同时要删除数据库时的报错问题

    当使用的EF的时候,我们都知道EF当实体模型与数据库的架构不同时要删除数据库,这是会把错: 无法创建与 'master' 数据库之间的连接,这是因为已打开原始数据库连接,并且已从连接字符串中删除凭据. ...

  7. csu 1312 榜单(模拟题)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1312 1312: 榜单 Time Limit: 1 Sec  Memory Limit: 128 ...

  8. LDPY Ghost Win7 64位 纯净自选版 V5.0

    ★ 概述: ☆ 源安装盘是[Windows7_SP1_ULTIMATE]微软官方SP1正式版. ☆ 破解激活WIN7,补丁更新至2013/06/18所有系统安全关键补丁. ☆ 破解 Windows 7 ...

  9. printf在终端输出时改变颜色

    在调试程序时,有时候要输出大量数据,如果让printf/fprintf改变输出数据的颜色,那观察数据就方便多了. 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.转义序 ...

  10. Map.entrySet() 简介

    转载:http://blog.csdn.net/mageshuai/article/details/3523116 今天看Think in java 的GUI这一章的时候,里面的TextArea这个例 ...