`
cfw2005
  • 浏览: 16727 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用memcached分布式保存PHP session

    博客分类:
  • php
阅读更多

安装完memcached之后
参考安装memcached客户端
在php.ini中
将session.save_handler 修改为memcache,并修改save_path指向memcached的地址和端口即可
session.save_handler = memcache
session.save_path = tcp://127.0.0.1:10001

Memcache的PECL这个扩展非常强大
可以支持failover以及分布存储
使用方法很讲但.
只需要在session.save_path的参数列表中
使用逗号分隔各个memcached服务器
则保存的session会经过hash之后保存到各个mc服务器中
而hash的算法.memcache支持两种,crc32以及fnv
memcache.hash_function= {crc32,fnv}
文档中很少有提到fnv算法的,据说其散列要比crc32更好
但是我通过以下小小的程序实验之后,发现仍旧是crc32的散列算法分布的更加平均.

<?php
ini_set("memcache.hash_function","crc32");
$memcache = new Memcache;
$memcache1 = new Memcache;
$memcache2 = new Memcache;
$memcache->addServer('localhost', 11211);
$memcache->addServer('localhost', 11212);
$memcache->flush();
$memcache1->connect('localhost',11211);
$memcache2->connect('localhost',11212);
$fp1 = fopen("mem1.txt","w");
$fp2 = fopen("mem2.txt","w");
for($i=0;$i<1000;$i++){
        $memcache->set($i,$i,0,1000);
        fwrite($fp1,$memcache1->get($i)." ");
        fwrite($fp2,$memcache2->get($i)." ");
}
fclose($fp1);
fclose($fp2);
?>

接着我就session的保存进行了测试
我开了3个memcached进程进行测试

 

<?php
ini_set("memcache.hash_function","fnv");
ini_set("error_reporting","E_CORE_ERROR");
$memcache1 = new Memcache;
$memcache1->connect('localhost',11211);
$memcache1->flush();
 
$memcache2 = new Memcache;
$memcache2->connect('localhost',11212);
$memcache2->flush();
 
$memcache3 = new Memcache;
$memcache3->connect('localhost',11213);
$memcache3->flush();
$fp1 = fopen("mem1.txt","w");
$fp2 = fopen("mem2.txt","w");
$fp3 = fopen("mem3.txt","w");
for($i=0;$i<1000;$i++){
        session_start();
        $ssid=session_id();
        echo $ssid;
        session_register("id");
        $_SESSION["id"]=$ssid;
        session_write_close();
        fwrite($fp1,$memcache1->get($ssid)." ");
        fwrite($fp2,$memcache2->get($ssid)." ");
        fwrite($fp3,$memcache3->get($ssid)." ");
        //session_destroy();
}
fclose($fp1);
fclose($fp2);
fclose($fp3);
?>

 比较奇怪的是.memcached2一般都会不被选中
而1,3的内容是一致的.可能是为了failover
而当我把1,3关闭一台后.2中将会出现内容,说明memcached2是正常工作的
而不论我的散列算法使用crc32还是fnv
这种现象都存在
最后我发现.这个测试程序存在问题
因为在session_write_close之后.整个程序的session都是唯一的了.
也就是虽然循环了这么多次.里面包含了session_destroy调用.但是返回的session id都是同样的
这就导致了两个文件中的内容一致而另一个文件中没有内容
基于此点
我只能分次调用脚本,脚本修改如下

<?php
ini_set("memcache.hash_strategy","consistent");
ini_set("memcache.hash_function","crc32");
ini_set("error_reporting","E_CORE_ERROR");
ini_set("memcache.allow_failover","0");
$memcache1 = new Memcache;
$memcache1->connect('localhost',10001);
$memcache1->flush();
 
$memcache2 = new Memcache;
$memcache2->connect('localhost',10002);
$memcache2->flush();
 
$memcache3 = new Memcache;
$memcache3->connect('localhost',10003);
$memcache3->flush();
$fp1 = fopen("mem1.txt","a+");
$fp2 = fopen("mem2.txt","a+");
$fp3 = fopen("mem3.txt","a+");
    session_start();
    $ssid=session_id();
    echo $ssid."\n";
    session_register("id");
    $_SESSION["id"]=$ssid;
    //session_destroy();
    session_write_close();
    fwrite($fp1,$memcache1->get($ssid)." ");
    fwrite($fp2,$memcache2->get($ssid)." ");
    fwrite($fp3,$memcache3->get($ssid)." ");
    session_destroy();
fclose($fp1);
fclose($fp2);
fclose($fp3);
?>

 然后再shell中重复运行多次.返回的ID不同了
再打开mem*.txt文件查看
发现3个文件中,每个session会保存在其中两个文件.然后分布不同
这证明了使用memcache来保存session.一个是做到了failover.第二会按照session id来做hash分布保存

 

分享到:
评论

相关推荐

    memcached 分布式缓存服务器

    2. **session 共享**:在分布式环境中,多个服务器间共享用户 session 数据。 3. **API 缓存**:缓存 API 返回的结果,降低后端计算压力。 4. **热点数据**:存储经常访问的数据,提高数据获取速度。 **其他文件...

    多台tomcat服务的session共享 memcached

    2. PHP:Memcached提供了PHP的API,方便 PHP 开发者使用 Memcached。 3. Python:Memcached提供了Python的API,方便 Python 开发者使用 Memcached。 4. Ruby:Memcached提供了Ruby的API,方便 Ruby 开发者使用 ...

    memcached扩展php5.3.8

    5. **分布式缓存**:Memcached作为分布式缓存系统,可以在多台服务器之间共享数据,通过负载均衡减少单台服务器的压力,提升整体系统的可扩展性和性能。 6. **键值存储**:Memcached基于键值对的数据结构,用户通过...

    php将session放入memcached的设置方法

    此外,文章还提到了其他相关主题,如PHP负载均衡、Nginx配置、Memcache的安装和使用,以及在不同场景下如何配置和使用Memcached存储session,这些都是在构建高效、可扩展的PHP应用时需要考虑的重要方面。使用...

    PHP实现多服务器session共享之memcache共享

    本文将深入探讨如何使用PHP和memcached实现多服务器session共享。 首先,memcached是一个高性能的分布式内存对象缓存系统,它可以临时存储数据,减少数据库负载。在PHP中,我们可以通过php_memcache扩展与memcached...

    memcached服务器端memcached.exe 下载

    在实际应用中,memcached广泛用于网站的session存储、数据库查询结果缓存、动态内容缓存等方面,有效提升了网站的响应速度和服务质量。通过合理地利用memcached,开发者可以优化Web应用性能,减少数据库压力,提高...

    6.4: Session与Cookie 、 部署memcached 、 Session共享 、 .docx

    - Memcached是一种分布式内存缓存系统,常用于缓解数据库压力,提高Web应用性能。在Session共享的场景中,可以将Session数据存储在Memcached中,实现多服务器间的Session共享。 - 构建Memcached服务涉及安装...

    利用Memcached在php下实现session机制 替换PHP的原生session支持

    Memcached是一个高性能的分布式内存对象缓存系统,它可以用来缓存各种数据,包括session数据。Memcached使用内存来存储数据,所以它的读写速度非常快,远超过传统的文件存储系统。利用Memcached实现session管理,...

    PHP基于memcahe的session方法重写

    为了解决这个问题,我们可以利用memcache(或其升级版memcached)来实现session的存储和共享,从而达到session跨服务器跨域的目的。本文将详细介绍如何基于memcache实现PHP的session方法重写。 首先,memcache是一...

    PHP实现多服务器session共享之memcache共享.rar

    总的来说,"PHP实现多服务器session共享之memcache共享"这个主题涵盖的知识点包括:session管理、分布式存储、memcache的使用、PHP配置、并发控制以及系统扩展性设计。掌握这些知识对于构建高可用、可扩展的Web应用...

    memcached在PHP下应用研究.pdf

    memcached 是一个高性能的分布式内存对象缓存系统,其守护进程只能用 C 语言写成,但客户端编写却没有严格的限制,能够使用任何语言,通过 memcached 协议与守护进程通信。memcached 的工作原理是将数据与对象缓存在...

    memcached中文学习文档

    Memcached是一种高性能的分布式内存对象缓存系统,用于加速动态Web应用程序通过减轻数据库负载。它通过在内存中缓存数据和对象来减少数据库访问的频率,从而提高网站的速度和响应时间。Memcached非常适合用来缓存...

    PHP_实现多服务器共享_SESSION_数据.rar

    一种常见的解决方案是使用中央化的SESSION存储,如数据库(MySQL、MongoDB等)、缓存服务(Redis、Memcached)或者专门的SESSION存储服务。通过在所有服务器上配置相同的SESSION处理函数,使得每次新的SESSION数据...

    Memcached-1.2.6

    Memcached可以作为Session的存储后端,实现Session的分布式共享。这样,无论用户在集群中的哪台服务器上发起请求,都能获取到相同的Session数据,提升了用户体验和系统的可扩展性。 4. **安装与配置Memcached-1.2.6...

    在win系统安装配置 Memcached for PHP 5.3 图文教程_.docx

    Memcached是一款高效、轻量级的分布式内存对象缓存系统,它可以存储各种类型的数据,如图像、视频、文件以及数据库查询结果,从而减少对硬盘的读取,提高响应速度。 **第一步:安装Memcached服务** 1. 首先,你...

    PHP 实现多服务器session共享之memcache共享

    传统的session存储方式在单服务器上工作良好,但在分布式系统中,由于每个服务器独立存储session,导致用户状态无法跨服务器同步。为了解决这个问题,我们可以利用缓存服务如memcache(或其更现代的变种memcached)...

    memcached-1.5.11.tar.gz

    4. 基于一致性哈希的分布式策略:在多台服务器部署时,Memcached使用一致性哈希算法,保证数据迁移时尽可能少地改变映射关系。 四、Memcached的API及使用 1. 客户端库:Memcached提供了多种语言的客户端库,如PHP...

    memcached客户端包memcached-1.4.12.tar.gz

    - **Session共享**:在分布式系统中,通过Memcached共享用户session,避免单点故障。 **五、优化与安全** 1. **内存管理**:合理设置内存大小,避免过度缓存导致系统资源浪费。 2. **过期策略**:设定合适的数据...

    memcached

    - **Session共享**:在分布式环境中,可以使用Memcached共享用户session,避免session数据在服务器之间同步的问题。 **6. 与其他缓存系统的对比** Memcached专注于简单、高速的键值存储,而Redis则提供了更丰富的...

    memcached-windows64-1.4安装文件

    2. **session共享**:在分布式环境中,可以将用户session存储在Memcached中,实现跨服务器的session共享。 3. **API缓存**:对于重复的API请求,可以先从缓存中获取数据,降低API调用频率。 4. **数据库查询结果缓存...

Global site tag (gtag.js) - Google Analytics