memcache cache session
2016-12-22 00:00
429 查看
memcache 和 memcached 的使用
配置客户端
(1)
memcache 是pecl扩展库版本,php.ini 中 extension=memcache.so (自带)。
memecached是基于 libmemcached 开发的(手动安装)。
mkdir /usr/src/php -p cd /usr/src/php wget https://pecl.php.net/get/memcached -O memcached-2.2.0.tgz tar xf memcached-2.2.0.tgz cd memcached-2.2.0 phpize # 我们在配置的添加一些新的功能,使其支持json和igbinary ./configure --enable-memcached --enable-memcached-json --enable-memcached-igbinary make make install # 注意最后的输出 # Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/ cp /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/*.so /usr/local/php/lib/php/extensions/ # vim /usr/local/php/etc/php.ini # 添加以下配置 [Memcached] extension=memcached.so
从手册上看,memcached 会比 memcache 多几个方法;
(2)memcache 是原生实现的,支持OO和非OO两套接口并存。而memcached是使用libmemcached,只支持OO接口;
(3)memcached 的 flag 不是在操作时设置的,而是有了一个统一的setOption(),Memcached 实现了更多的 memcached 协议;
服务端
memcached:服务端守护进程,展现是酱紫滴.
# /usr/local/bin/memcached -d -m 2048 -u root -l 192.168.1.20 -p 12111 -c 1024 -P /tmp/memcached.pid
初始化
memcache: $mc = new memcache;
$mc->addServer(host1,port1);
$mc->addServer(host2,port2);
......
memcached : $mdc = new memcached;
$mdc->addServer(
array(host1,port1),
array(host2,port2),
......
);
普遍使用场景:
1)cache 数据库 select 数据;
2)cache session;
### 一些概念梳理:
$_COOKIE[session.name] == session_id();
存放 /tmp/file:sess_+ session_id()
存放 mem: SessionDriver.php 定义的 session_ 前缀 + session_id() ,验证方式参考“命令行遍历”
一些参数设置:
memcache.allow_failover 一个布尔值,用于控制当连接出错时 Memcache 扩展是否故障转移到其他服务器上。默认值为 1 (true)。
memcache.max_failover_attempts 一个整型值,用于限制连接到持久性数据或检索数据的服务器数目。如果 memcache.allow_failover 为 false,则将忽略此参数。默认值为 20。
memcache.chunk_size 一个整型值,用于控制数据传输的大小。默认值为 8192 字节 (8 KB),但是如果设置为 32768 (32 KB),则可以获得更好的性能。
memcache.default_port 另一个整型值,用于设置连接到 Memcache 所使用的 TCP 端口。除非您修改它,否则默认值为无特权的端口 11211。
PHP 遍历 memcached
public function dispMemcache(){ $host='127.0.0.1'; $port=11211; $mem=new Memcache(); $mem->connect($host,$port); $items=$mem->getExtendedStats('items'); $items=$items["$host:$port"]['items']; foreach($items as $key => $values){ $number=$key; $str=$mem->getExtendedStats("cachedump",$number,0); $line=$str["$host:$port"]; if( is_array($line) && count($line)>0){ foreach($line as $key=>$value){ echo $key.'=>'; print_r($mem->get($key)); echo "\r\n"; } } } }
命令行遍历:
# key:session_.... telnet 127.0.0.1 11211 stats items ...... stats cachedump 2 0 ITEM session_p97rknannrdfsji4cldmd0oar1 [15 b; 1480379257 s] END get session_p97rknannrdfsji4cldmd0oar1 VALUE session_p97rknannrdfsji4cldmd0oar1 0 15 aaa|s:4:"vaaa";
遇到的问题:
产品用了两台分布式的memcached服务器。
某一个计数器取回来的数偶尔会不对,最后定位在php memcache client的failover机制上面。
我们知道,在memcached分布式环境下,某一个key是通过hash计算,分配到某一个memcached上面的,如果php.ini里面 memcache.allow_failover = 1的时候,在分布式环境下,某一台memcached出问题的话,会自动到其他的memcached尝试,就会出现上面的问题,原因如下:
这个key是hash到服务器A的,但是服务器A正好一瞬间连不上(网络或者其他问题),PHP就会去另一台服务器B去尝试。
经过很偶然发生的网络问题和很多次increment操作,有可能两台服务器上面都有这个key,而且值不一样……
get的时候有可能取到不同的值。如果对数据一致性要求很严格的话,可以关掉这个参数 memcache.allow_failover = 0
Session
[php手册]session_id() 返回当前会话ID。 如果当前没有会话,则返回空字符串("")。
相关文章推荐
- 实战Memcached缓存系统
- Angularjs 跨域请求
- kindeditor 批量上传 上传失败 thinkphp swfupload session
- Python 学习笔记 - Memcached
- 杰奇登录后的东西都是在session里面的
- 分析Cache 在 Ruby China 里面的应用情况
- Redis和Memcached的区别详解
- ASP中SESSION无法保存问题的解决办法
- 使用Memcache缓存mysql数据库操作的原理和缓存过程浅析
- Oracle中的Connect/session和process的区别及关系介绍
- asp 页面允许CACHE的方法
- Node.js编程中客户端Session的使用详解
- web 应用中常用的各种 cache详解
- 完美解决ajax访问遇到Session失效的问题
- SqlServer中如何解决session阻塞问题
- 浅谈COOKIE和SESSION区别
- Webform 内置对象 Session对象、Application全局对象,ViewState详细介绍