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. 拓展:return和print的使用时机

    拓展:return和print的使用时机  一直纠结函数里的return用法.以下内容摘自百度知道..def 是用来定义函数的一个关键字,只有在函数的定义时用到他.Python 函数定义的语法:def ...

  2. bootstrap IE兼容

    <meta name="viewport" content="width=device-width, initial-scale=1">     & ...

  3. Ubuntu 14.04的SWAP 为0

    [@@@@@@]# free total used free shared buffers cached Mem: 1024976 248992 775984 0 16820 73128 -/+ bu ...

  4. 大批量DML操作应该注意什么?

    问:大批量DML操作应该注意什么? 答:大批量DML操作可能会撑爆undo表空间,导致数据库挂起.因此我们应该设置一个合适的undo表空间,或对DML操作的分批提交.

  5. oracle 绿色版本 instantclient 使用说明

    1,将instantclient直接放到D盘根目录 2,注册表修改 3,点击工具>>首选项, 在Oracle主目录名中输入“D:\instantclient_10_2\”,在OCI库中输入 ...

  6. DataGrid中取HyperLinkColumn列的值,处理DataGrid中绑定的特殊字符

    DataGrid中取HyperLinkColumn列的值. /// <summary> /// 对datagrid中标签进行编码,处理特殊字符 /// </summary> / ...

  7. Eclipse中设置作者日期等信息

    在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的,例如其中author 的属性值. 我们可以在Eclipse 中进行设置自己希望显示的信息. 现在看看如何修改 ...

  8. 【BZOJ 2878】 [Noi2012]迷失游乐园

    Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环( ...

  9. c#无标题窗体点击任务栏图标正常最小化或还原

    FormBorderStyle等于System.Windows.Forms.FormBorderStyle.None的窗体,点击任务栏图标的时候,是不能象标准窗体那样最小化或还原的. protecte ...

  10. jQuery树结构插件推荐zTree

    JQuery zTree 下载地址http://plugins.jquery.com/zTree.v3/