知识大全 基于php使用memcache存储session的详解

Posted

篇首语:鞭打的快马,事找的忙人。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 基于php使用memcache存储session的详解相关的知识,希望对你有一定的参考价值。

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

   设置session用memcache来存储 方法I: 在 php ini 中全局设置 session save_handler = memcache session save_path = "tcp:// : " 方法II 某个目录下的 htaccess php_value session save_handler "memcache" php_value session save_path "tcp:// : " 方法III 再或者在某个一个应用中 ini_set("session save_handler" "memcache"); ini_set("session save_path" "tcp:// : "); 使 用多个 memcached server 时用逗号" "隔开 并且和 Memcache::addServer() 文档中说明的一样 可以带额外的参数"persistent" "weight" "timeout" "retry_interval" 等等 类似这样的 "tcp://host :port ?persistent= &weight= tcp://host :port " 如果安装的PECL是memcached(使用libmemcache库的那个) 则配置应为 ini_set("session save_handler" "memcached"); // 是memcached不是memcache ini_set("session save_path" " : "); // 不要tcp:

   启动 memcached memcached d l p m 或 启动Memcache的服务器端 memcached d m u root l p c P /tmp/memcached pid # /usr/local/bin/memcached d m u root l p c P /tmp/memcached pid 引用 d选项是启动一个守护进程 m是分配给Memcache使用的内存数量 单位是MB 我这里是 MB u是运行Memcache的用户 我这里是root l是监听的服务器IP地址 如果有多个地址的话 我这里指定了服务器的IP地址 p是设置Memcache监听的端口 我这里设置了 最好是 以上的端口 我们这里统一使用 c选项是最大运行的并发连接数 默认是 我这里设置了 按照你服务器的负载量来设定 P是设置保存Memcache的pid文件 我这里是保存在/tmp/memcached pid

   在程序中使用 memcache 来作 session 存储 用例子测试一下

复制代码 代码如下: <?php session_start(); if (!isset($_SESSION[ TEST ])) $_SESSION[ TEST ] = time(); $_SESSION[ TEST ] = time(); print $_SESSION[ TEST ]; print "<br><br>"; print $_SESSION[ TEST ]; print "<br><br>"; print session_id(); ?>

   用 sessionid 去 memcached 里查询一下

复制代码 代码如下: <?php $memcache = memcache_connect( localhost ); var_dump($memcache >get( c cedec b c eeb e )); $memcache >set( aaaa hello everyone ); var_dump($memcache >get( aaaa )); ?>

   会看到 string( ) "TEST|i: ;TEST |i: ;" 这样的输出 证明 session 正常工作 用 memcache 来存储 session 在读写速度上会比 files 时快很多 而且在多个服务器需要共用 session 时会比较方便 将这些服务器都配置成使用同一组 memcached 服务器就可以 减少了额外的工作量 缺点是 session 数据都保存在 memory 中 持久化方面有所欠缺 但对 session 数据来说也不是很大的问题 =================================== 一 般地 Session 是以文本文件形式存储在服务器端的 如果使用 Seesion 或者该 PHP 文件要调用 Session 变量 那么就必须在调用 Session 之前启动它 使用 session_start() 函数 其它都不需要你设置了 PHP 自动完成 Session 文件的创建 其默认 Session 的存放路径是服务器的系统临时文件夹 但是如果碰到大数据量的Sesstion的时候 使用基于文件的Session存取瓶颈可能都是在磁盘IO操作上 现在利用Memcached来保存Session数据 直接通过内存的方式 效率自然能 够提高不少 在读写速度上会比 files 时快很多 而且在多个服务器需要共用 session 时会比较方便 将这些服务器都配置成使用同一组 memcached 服务器就可以 减少了额外的工作量 其缺点是 session 数据都保存在 memory 中 一旦宕机 数据将会丢失 但对 session 数据来说并不是严重的问题 如何用 memcached 来存储 session呢?以下是基本的配置步骤 安装 memcached 在 phpinfo 输出中的 “Registered save handlers” 会有 “files user sqlite”

   修改配置文件 a 在 php ini 中全局设置(* 需要重启服务器) session save_handler = memcache session save_path = "tcp:// : " b 或者某个目录下的 htaccess : php_value session save_handler "memcache" php_value session save_path "tcp:// : " c 也可以在某个一个应用中 ini_set("session save_handler" "memcache"); ini_set("session save_path" "tcp:// : "); 使 用多个 memcached server 时用逗号” ”隔开 并且和 Memcache::addServer() 文档中说明的一样 可以带额外的参数”persistent” ”weight” ”timeout” ”retry_interval” 等等 类似这样的 ”tcp://host:port?persistent= &weight= tcp://host :port ″

   启动 memcached memcached d m u root l p c P /tmp/memcached pid

   测试 创建一个 session

复制代码 代码如下: <?php //set_session php session_start(); if (!isset($_SESSION[ admin ])) $_SESSION[ TEST ] = wan ; print $_SESSION[ admin ]; print "n"; print session_id(); ?>

   用 sessionid 去 memcached 里查询一下

复制代码 代码如下: <?php //get_session php $mem = new Memcache; $mem >connect(" " ); var_dump($mem >get( dbc d d f efb affa )); ?> 复制代码 代码如下: [root@localhost ]# /usr/local/webserver/php/bin/php f get_session php

   输出结果 string( ) "admin|s: :"wan";" 证明 session 正常工作 =========================== 用 memcache 来存储 session 在读写速度上应该会比文件快很多 而且在多个服务器需要共用 session 时会比较方便 将这些服务器都配置成使用同一组 memcached 服务器就可以 减少了额外的工作量 缺点是 session 数据都保存在内存中 不能持久化存储 如果想持久化存储 可以考虑使用Memcachedb来存储 或用Tokyo Tyrant+Tokyo Cabinet来进行存储 怎样判断session失效了呢?在php ini中有个Session cookie_lifetime的 选项 这个代表SessionID在客户端Cookie储存的时间 默认值是“ ” 代表浏览器一关闭 SessionID就作废 这样不管保存在 Memcached中的Session是否还有效(保存在Memcached中的session会利用Memcached的内部机制进行处理 即使 session数据没有失效 而由于客户端的SessionID已经失效 所以这个key基本上不会有机会使用了 利用Memcached的LRU原则 如果Memcached的内存不够用了 新的数据就会取代过期以及最老的未被使用的数据) 因为SessionID已经失效了 所以在客户端会重新生成一 个新的SessionID 保存在Memcached中的数据最长不会超过 天 这个时间是以操作Memcached的时间为基准的 也就是说 只要key还是原来的key 如果你重新对此key进行了相关的操作(如set操作) 且重新设置了有效期 则此时此key对应的数据的有效期 会重新计算的 php手册中有说明 Expiration time of the item If it s equal to zero the item will never expire You can also use Unix timestamp or a number of seconds starting from current time but in the latter case the number of seconds may not exceed ( days) Memcached主要的cache机制是LRU(最近最少用)算法+超时失效 当您存数据到memcached中 可以指定该数据在缓存中可以呆多久 如果memcached的内存不够用了 过期的slabs会优先被替换 接着就轮到最老的未被使用的slabs =========================== 为了使web应用能使用saas模式的大规模访问 必须实现应用的集群部署 要实现集群部署主要需要实现session共享机制 使得多台应用服务器之间会话统一 tomcat等多数服务都采用了session复制技术实现session的共享 session复制技术的问题: ( )技术复杂 必须在同一种中间件之间完成(如:tomcat tomcat之间) ( )在节点持续增多的情况下 session复制带来的性能损失会快速增加 特别是当session中保存了较大的对象 而且对象变化较快时 性能下降更加显著 这种特性使得web应用的水平扩展受到了限制 session 共享的另一种思路就是把session集中起来管理 首先想到的是采用数据库来集中存储session 但数据库是文件存储相对内存慢了一个数量级 同时 这势必加大数据库系统的负担 所以需要一种既速度快又能远程集中存储的服务 所以就想到了memcached

  memcached能缓存什么? 通过在内存里维护一个统一的巨大的hash表 Memcached能够用来存储各种格式的数据 包括图像 视频 文件以及数据库检索的结果等

cha138/Article/program/PHP/201311/20946

相关参考

知识大全 关于PHP session 存储方式的详细介绍

关于PHPsession存储方式的详细介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  PHP

知识大全 关于JSP中基于Session的在线用户统计分析

关于JSP中基于Session的在线用户统计分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 关于JSP中基于Session的在线用户统计分析[1]

关于JSP中基于Session的在线用户统计分析[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 关于JSP中基于Session的在线用户统计分析[3]

关于JSP中基于Session的在线用户统计分析[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 关于JSP中基于Session的在线用户统计分析[2]

关于JSP中基于Session的在线用户统计分析[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 基于JSP实现图片的数据库存储与显示

基于JSP实现图片的数据库存储与显示  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixin

知识大全 基于SQL Server的Asp.net图片存储技术

基于SQLServer的Asp.net图片存储技术  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 如何通过hibernate调用存储过程

用hibernate操作数据库可以通过获取的session值调用connection()方法获取connection从而调用存储过程java调用存储过程什么是存储过程?存储过程是指保存在数据库并在数据

知识大全 09年自考《数据结构》各章要点一[5]

  顺序表和链表的比较  ·基于空间  ·顺序表的存储空间是静态分配存储密度为适于线性表事先确定其大小时采用  ·链表的存储空间是动态分配存储密度<适于线性表长度变化大时采用  ·基于时间  ·

知识大全 数据结构之顺序表和链表的比较[2]

  链表的优缺点基本上与顺序表是相反在实际应用中选取哪种存储结构应根据实际情况在存储和操作上进行权衡考虑  基于存储的考虑  顺序表的存储空间是静态分配的在程序执行之前必须明确规定它的存储规模也就是说