让php或httpd服务来使用memcached存储session数据

memcached命令行

memcached语法

<command?name>?<key>?<flags>?<exptime>?<bytes>\r\n?<data?block>\r\n注:??\r\n在windows下是Enter键
<command?name>可以是set,?add,?replace
set ? ? ? ? ? 表示按照相应的<key>存储该数据,??没有的时候增加,??有的时候覆盖
add ? ? ? ? ?表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败
replace ? ?表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败。
<key>客户端需要保存数据的key语法
<flags>是一个16位的无符号的整数(以十进制的方式表示)。该标志将和需要存储的数据一起存储,并在客户端get数据时返回。
客户端可以将此标志用做特殊用途,此标志对服务器来说是不透明的。.?<exptime>为过期的时间。
若为0表示存储的数据永远不过期(但可被服务器算法:LRU等替换)。
如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
<bytes>需要存储的字节数,当用户希望存储空数据时<bytes>可以为0.?<data?block>需要存储的内容,输入完成后,最后客户端需要加上\r\n(直接点击Enter)?作为结束标志。

安装登录memcached的telnet命令
yum install telnet
使用telnet登录memcached终端

[[email protected] ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.

在memcached中添加一个key

[[email protected] src]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.
set key1 0 200 2
ab
STORED

值其中第一个数值一个特殊标记位的符号,用于客户端特殊用途的使用,此标志对服务器来说是不透明的
第二个表示为过期时间,过了多少秒后该key值过期被服务器释放,若为0则表示存储数据永不过期(但可以被服务器算法:LRU等替换)。如果非0(unix的时间或距离此时的秒数),当过期时间后,服务器可以保证用户得不到该数据(以服务器时间为第一标准)
第三段存储的是内容字节,当用户希望存储的数据为空时可以为0,当输入完成后,最后客户端需要加上\r或\n表示结束标志(直接Enter回车)

定义一个key值,并查询其经过30秒后的值,查看其值是否还存在

set key2 0 30 3 ? ? ? ? ? ? ? ?  创建key2值,设定为30秒过期
abc
STORED
get key2
VALUE key2 0 3 ? ? ? ? ? ? ? ? ?get查看key的值
abc
END
get key2 ? ? ? ? ? ? ? ? ? ? ?  经过30秒后,再次查看key2的值,发现数据已经过期
END

更改一个存在的key值并查看该值数据

set key2 0 0 5 ? ? ? ? ? ? ? ?  创建key2值,设定为永不过期
abcde
STORED
get key2 ? ? ? ? ? ? ? ? ? ? ?  查看key2值
VALUE key2 0 5
abcde
END
replace key2 1 200 2 ? ? ? ? ?  变更key2的值,设定为200秒过期
22
STORED
get key2 ? ? ? ? ? ? ? ? ? ? ? ?get查看key值变化
VALUE key2 1 2
22
END
get key2 ? ? ? ? ? ? ? ? ? ? ?  经过200秒后,再次查询key2,发现数据已经过期
END

定义一个key1的值并删除它

set key1 0 2000 3 ? ? ? ?  创建key1值,2000秒过期时间
123
STORED
get key1 ? ? ? ? ? ? ? ? ? 查看key1的值
VALUE key1 0 3
123
END
delete key1 ? ? ? ? ? ? ?  删除key1
DELETED
get key1 ? ? ? ? ? ? ? ? ? 再次get key1发现没有数值内容
END

在memcached输入行内按ctrl+ ] ?及quit来退出输入终端
?

memcached数据导出和导入

记录数据过期的时间戳
memcached导出的数据都是带有一个时间戳的,这个时间戳是数据过期的时间点,如果当前时间已经超过了该记录的时间戳,那么该条数据即使导入到memcached中也会被过期
导出memcached数据
首先在memcached输入终端内创建几个测试数据

set k1 1 48000 6 ? ? ? k1值过48000秒过期
222333
STORED
get k1
VALUE k1 1 6 ? ? ? ? ? 查看k1内容
222333
END
set k2 1 3600 3 ? ? ?  k2值过3600秒过期
233
STORED
get k2 ? ? ? ? ? ? ? ? 查看k2的值
VALUE k2 1 3
233
END
^] ? ? ? ? ? ? ? ? ?  ctrl+]退出
telnet> quit
Connection closed.

使用memcached-tool命令查看及导出memcache的数据
如果没有这个命令,则需要使用yum进行安装

[[email protected] ~]# memcached-tool 127.0.0.1:11211 dump
Dumping memcache contents
  Number of buckets: 1
  Number of items : 2
Dumping bucket 1 - 2 total items
add k2 1 1541597693 3
233
add k1 1 1541642057 6
222333

将memcache数据导出到文件中
导出后可以使用cat命令来查看数据文件内容,内容中包含数据过期的时间戳

[[email protected] ~]# memcached-tool 127.0.0.1 dump > data.txt
Dumping memcache contents
  Number of buckets: 1
  Number of items : 2
Dumping bucket 1 - 2 total items
[[email protected] ~]# cat data.txt
add k2 1 1541597693 3 ? ? ? ? ? ? ? ? ?  k1值是1类型、过期时间戳、k1的数值字段长度
233
add k1 1 1541642057 6
222333

导出数据后我们可以重启memcached服务,来让memcached中的数据都清空,以便让我们把备份数据导入进去
重启后memcached数据为0

[[email protected] ~]# systemctl restart memcached.service
[[email protected] ~]# memcached-tool 127.0.0.1:11211 dump
Dumping memcache contents
  Number of buckets: 0
  Number of items : 

使用nc命令工具导入数据
若该命令不存在,则需要使用yum安装:yum install -y nc
以上使用memcached-tool查看了当前的数据都为空,那么我们需要使用nc命令将备份数据恢复到memcached当中,如果当前系统时间已经超过了某条数据记录的时间戳,那么在导入整个备份后,这条数据也会被过期
因为我备份数据时的时间戳在导出时发生过期,这里我使用date命令又生成了一个没有过期的时间戳,来替换备份数据文件中保存的时间戳

[[email protected] ~]# date -d "+1 day" +%s
1541752940
[[email protected] ~]# vim data.txt
add k2 1 1541752940 3
233
add k1 1 1541752940 6
222333

再次重新导入数据
登录到memcached输入终端里后可以查看到恢复的key值

[[email protected] ~]# nc 127.0.0.1 11211 < data.txt
STORED
STORED
[[email protected] ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.
get k1
VALUE k1 1 6
222333
END
get k2
VALUE k2 1 3
233
END

注意:如果在memcached中定义一个key为永不过期的设定后,在备份时则会改变该设定,会将永不过期的时间戳更换为备份数据那一刻的时间戳来保存。如果这样的话,那我们在恢复备份的数据时那些永不过期的数据则不会从备份恢复到memcached数据库内

php链接memcached

让php能够链接使用memcached,我们需要向php中编译memcached的模块,这样php才能够支持向memcached中写入数据
首先我们需要下载memcached的模块

[[email protected] php-5.6.37]# cd /usr/local/src/
[[email protected] src]# wget http://www.biliboy.com/bbs/data/attachment/forum/memcache-2.2.3.tgz
-------------------省略----------地址可能失效,如果失效请自行寻找memcache的模块
[[email protected] src]# tar zxf memcache-2.2.3.tgz
[[email protected] src]# cd memcache-2.2.3
[[email protected] memcache-2.2.3]# /usr/local/php-fpm/bin/phpize ? ? ? ? ? ?
Configuring for: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?-------------使用phpize文件来生成编译文件
PHP Api Version: 20160303
Zend Module Api No: 20160303
Zend Extension Api No: 320160303

生成编译文件后,在下载解压的模块目录下执行./configure来编译新功能模块

[[email protected] memcache-2.2.3]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config
checking for grep that handles long lines and -e... /usr/bin/grep
-------------------------------------省略
[[email protected] memcache-2.2.3]# make
[[email protected] memcache-2.2.3]# make install

如果编译中有报错(我的php是7.0以上版本,对某些扩展的兼容性不太友好):
如果出现以下错误,建议更换成php7正式稳定版,或者给php降级(安装php5版本)

/usr/local/src/memcache-2.2.3/memcache.c:40:40: fatal error: ext/standard/php_smart_str.h: No such file or directory
 #include "ext/standard/php_smart_str.h"
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?  ^
compilation terminated.
make: *** [memcache.lo] Error 1

安装完成后会有如下的类似提示:
memcached的扩展模块会保存在该目录下
Installing shared extensions:/usr/local/php-fpm/php/extensions/no-debug-non-zts-20131226/
然后我们需要在php.ini的文件中添加memcached的支持,一般将新扩展加入extension区域下,方便统一格式

[[email protected] etc]# vim php.ini
;extension=php_shmop.dll
extension="memcache.so"

使用php-fpm来查看已经安装的扩展模块

[[email protected] etc]# /usr/local/php-fpm/sbin/php-fpm -m | grep memcache
memcache

测试php是否能够正常使用memcached存储数据,这里使用到一个php页面来解析

[[email protected] src]# cat 1.php
<?php
//连接Memcache Memcache
$mem = new Memcache;
$mem->connect("localhost", 11211);
//保存数据
$mem->set(‘key1‘, ‘This is first value‘, 0, 60);
$val = $mem->get(‘key1‘);
echo "Get key1 value: " . $val ."<br>";
//替换数据
$mem->replace(‘key1‘, ‘This is replace value‘, 0, 60);
$val = $mem->get(‘key1‘);
echo "Get key1 value: " . $val . "<br>";
//保存数组数据
$arr = array(‘aaa‘, ‘bbb‘, ‘ccc‘, ‘ddd‘);
$mem->set(‘key2‘, $arr, 0, 60);
$val2 = $mem->get(‘key2‘);
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
//删除数据
$mem->delete(‘key1‘);
$val = $mem->get(‘key1‘);
echo "Get key1 value: " . $val . "<br>";
//清除所有数据
$mem->flush();
$val2 = $mem->get(‘key2‘);
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
//关闭连接
$mem->close();
?>

执行php页面来查看测试效果,或者将该php页面放入某个虚拟主机下,在浏览器中访问同样可以看到效果

[[email protected] src]# /usr/local/php-fpm/bin/php 1.php
Get key1 value: The is first value<br>Get key1 value: This is replace value<br>Get key2 value: Arreay
(
 ?  [0] => aaa
 ?  [1] => bbb
 ?  [2] => ccc
 ?  [3] => ddd
)

如果解析出来的反馈结果跟以上相同,那么即php能够正确的链接memcached数据库了

memcached中存储session

应用场景
在一个多web服务器的环境下,用户访问一个网站时是需要登录的,如果发生访问负载分发,那么会将用户已登录状态的访问从A服务器分发到B服务器,结果就是用户的登录状态被退出了,这样的话,用户每点击(刷新)一次页面,访问请求就会被分发到一台新的服务器上。这样的话用户就无法正常登录网站
注意一:
这里的配置:
nginx是192.168.1.234,php192.168.1.115,memcached也是192.168.1.115。如果是实际环境中,memcached可以不和任意的其他服务部署在一起,但是php服务器上必须安装memcached的扩展,因为想要和memcached通信的话就需要使用到这个扩展模块。多台php或者web(httpd)可以指向一台memcached来存储session数据
注意二:
nginx可以通过设定将session存储到memcached当中
php也可以通过设定将session存到memcached中。但是这里的验证出现问题
如果使用的是apache的httpd,也可以通过同样的配置来设定

本实例是在lnmp环境下实现编辑php.ini添加两行
但在php.ini中添加memcached缓存的配置会发生无法存储的情况,这里放弃在php.ini中配置memcached的设定了
session.save_path是指定了memcached服务器ip及端口的配置项

session.save_handler = memcache
session.save_path = "tcp://192.168.1.115:11211"

或者httpd.conf中对应的虚拟主机中添加

php_value_session.save_handler "memcache"
php_value_session.save_path "tcp://192.168.1.115:11211"

或者php-?fpm.?conf对应的pool中添加

php_value[session.save_handler] = memcache
php_value[session.save_path] = " tcp://192.168.1.115:11211 "

这里在php的pool池中来设定的memcache存储指向的地址

[[email protected] src]# vim /usr/local/php-fpm/etc/php-fpm.conf
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[web]
listen = 192.168.1.115:9000
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
php_admin_value[post_max_size] = 32M
php_admin_value[max_execution_time] = 300
php_admin_value[date.timezone] = ‘Asia/Shanghai‘
php_value[session.save_handler] = memcache
php_value[session.save_path] = " tcp://192.168.1.115:11211 "

在nginx本地来验证memcached的数据存储内容

[[email protected]~ ]# curl localhost/1.php ? ? ? ?
1541759135<>br<br>1541759135<>br<br>mjrbq0hg45dd89ttdd32bjgue9
[[email protected]~ ]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.
get mjrbq0hg45dd89ttdd32bjgue9
VALUE mjrbq0hg45dd89ttdd32bjgue9
TEST|i:1541759135;TEST3|i:1541759135;
END

通过解析php页面,可以从验证结果中的到了存储的session数据

以上是个人学习中的见解,如有错误,欢迎各位请多多指教

原文地址:http://blog.51cto.com/8844414/2314709

时间: 2024-11-03 21:34:33

让php或httpd服务来使用memcached存储session数据的相关文章

为什么不能用memcached存储Session?

Memcached创建者Dormando非常早就写过两篇文章[1][2].告诫开发者不要用memcached存储Session. 他在第一篇文章中给出的理由大致是说,假设用memcached存储Session,那么当memcached集群发生问题(比方内存溢出)或者维护(比方升级.添加或降低server)时,用户会无法登录.或者被踢掉线.而在第二篇文章中.他则指出.memcached的回收机制可能会导致用户无缘无故地掉线. Titas Norkūnas是DevOps咨询服务提供商Bear Mou

[转]为什么不能用memcached存储Session

以下内容转自:http://www.infoq.com/cn/news/2015/01/memcached-store-session -------------------------分割线----------------------------------------------- Memcached创建者Dormando很早就写过两篇文章[1][2],告诫开发人员不要用memcached存储Session.他在第一篇文章中给出的理由大致是说,如果用memcached存储Session,那么

Memcached存Session数据、访问安全性、使用场景总结(3)

最近做了一个单点登录SSO,登陆后的凭证放到Memcached令牌放到Cookies:但是用户经常掉线,开发环境和测试却没有这个问题,最后从Memcached找到原因. Memcached概念.作用.运行原理.特性.不足简单梳理(1) Memcached下载安装.NET对Memcached进行CRUD操作(2) Memcached存Session数据.访问安全性.使用场景总结(3) 一.Session数据放入到Memcached? Memcached创建者Dormando写过两篇文章: Sess

为什么不能用 memcached 存储 Session

一.如果用memcached 存储 Session,那么当 memcached 集群发生故障(比如内存溢出)或者维护(比如升级.增加或减少服务器)时,用户会无法登录,或者被踢掉线. 二.memcached 的回收机制可能会导致用户无缘无故地掉线.因为Memcached 使用"最近最少使用(LRU)"算法回收缓存.这意味着,如果所有 Session 的大小大致相同,那么它们会分成两三个 slab 类.所有其它大小大致相同的数据也会放入同一些 slab,与 Session 争用存储空间.一

symfony2使用Memcached存储Session

1.添加如下代码到app/config/services.yml: parameters:     memcached.servers:       - { host: 127.0.0.1, port: 11211 }   services:     session.handler.memcached:         class: Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler  

五,session数据写入memcached

1,session数据通常保存在服务器端的文件中,它的默认过期时间是1440s.我们可以将session数据保存到memcached中,设定memcached的过期时间大于session过期时间即可.这样从内存读取session数据的速度高于从文件读取session数据. 2,session数据如果写入memcached,必须在php.ini中修改session的存取方式和存取路径. 将session.save_handler = files修改为session.save_handler = m

Memcached 笔记与总结(9)Memcached 与 Session

一.Memcached 存储 Session 由于 Memcached 是分布式的内存对象缓存系统,因此可以用来实现 Session 同步:把 Web 服务器中的内存组合起来,成为一个“内存池”,不管是哪个服务器产生的 Sessoin 都可以放到这个“内存池”中,其他的 Web 服务器都可以使用.使用 Memcached 来同步 Session 的优点是:不会加大数据库的负担,并且安全性比 Cookie 高,把 Session 放到内存里面,读取速度比其他处理方式要快很多. 自定义使用 Memc

memcached存储解析

Memcached如何存储我们的数据? 要很好的使用Memcached,那么必须知道我们的数据交给Memcached,它是怎么处理它们的.为了说明这个,需要先了解几个名词:slab class,page,chunk.它们三者之间的关系如下:  slab class :memcached会自动根据设置的chunk size以及当前分配给memcached创建一系列slab class,单个slab class中的chunk大小是一样的,而每个slab class中的chunk大小根据设置设置的ch

Memcached缓存Session(不建议)

本文源链接地址:https:www.93bok.com 实验环境: Centos6.5minimal 64位系统 服务器IP:192.168.10.22 说明: 1. LNMP+Memcached环境搭建不再演示,可参考之前文章 2. 相信大家也看到了,文章的后边加了(不建议)的后缀,说说原因吧: A.如果用memcached存储Session,那么当memcached集群发生故障(比如内存溢出)或者维护(比如升级.增加或减少服务器)时,用户会无法登录,或者被踢掉线 B.memcached 的回