博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让php或httpd服务来使用memcached存储session数据
阅读量:6526 次
发布时间:2019-06-24

本文共 8677 字,大约阅读时间需要 28 分钟。

memcached命令行

memcached语法

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

安装登录memcached的telnet命令

yum install telnet
使用telnet登录memcached终端

[root@localhost ~]# telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.

在memcached中添加一个key

[root@nfs1 src]# telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.set key1 0 200 2abSTORED

值其中第一个数值一个特殊标记位的符号,用于客户端特殊用途的使用,此标志对服务器来说是不透明的

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

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

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

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

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

定义一个key1的值并删除它

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

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

 

memcached数据导出和导入

记录数据过期的时间戳

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

set k1 1 48000 6       k1值过48000秒过期222333STOREDget k1VALUE k1 1 6           查看k1内容222333ENDset k2 1 3600 3        k2值过3600秒过期233STOREDget k2                 查看k2的值VALUE k2 1 3233END^]                    ctrl+]退出telnet> quitConnection closed.

使用memcached-tool命令查看及导出memcache的数据

如果没有这个命令,则需要使用yum进行安装

[root@localhost ~]# memcached-tool 127.0.0.1:11211 dumpDumping memcache contents  Number of buckets: 1  Number of items : 2Dumping bucket 1 - 2 total itemsadd k2 1 1541597693 3233add k1 1 1541642057 6222333

将memcache数据导出到文件中

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

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

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

重启后memcached数据为0

[root@localhost ~]# systemctl restart memcached.service[root@localhost ~]# memcached-tool 127.0.0.1:11211 dumpDumping memcache contents  Number of buckets: 0  Number of items :

使用nc命令工具导入数据

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

[root@localhost ~]# date -d "+1 day" +%s1541752940[root@localhost ~]# vim data.txt add k2 1 1541752940 3233add k1 1 1541752940 6222333

再次重新导入数据

登录到memcached输入终端里后可以查看到恢复的key值

[root@localhost ~]# nc 127.0.0.1 11211 < data.txtSTOREDSTORED[root@localhost ~]# telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.get k1VALUE k1 1 6222333ENDget k2VALUE k2 1 3233END

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

php链接memcached

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

首先我们需要下载memcached的模块

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

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

[root@nfs1 memcache-2.2.3]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-configchecking for grep that handles long lines and -e... /usr/bin/grep-------------------------------------省略[root@nfs1 memcache-2.2.3]# make [root@nfs1 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区域下,方便统一格式

[root@nfs1 etc]# vim php.ini ;extension=php_shmop.dllextension="memcache.so"

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

[root@nfs1 etc]# /usr/local/php-fpm/sbin/php-fpm -m | grep memcachememcache

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

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

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

[root@nfs1 src]# /usr/local/php-fpm/bin/php 1.php Get key1 value: The is first value
Get key1 value: This is replace value
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 = memcachesession.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] = memcachephp_value[session.save_path] = " tcp://192.168.1.115:11211 "

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

[root@nfs1 src]# vim /usr/local/php-fpm/etc/php-fpm.conf[global]pid = /usr/local/php-fpm/var/run/php-fpm.piderror_log = /usr/local/php-fpm/var/log/php-fpm.log[web]listen = 192.168.1.115:9000listen.mode = 666user = php-fpmgroup = php-fpmpm = dynamicpm.max_children = 50pm.start_servers = 20pm.min_spare_servers = 5pm.max_spare_servers = 35pm.max_requests = 500rlimit_files = 1024php_admin_value[post_max_size] = 32Mphp_admin_value[max_execution_time] = 300php_admin_value[date.timezone] = 'Asia/Shanghai'php_value[session.save_handler] = memcachephp_value[session.save_path] = " tcp://192.168.1.115:11211 "

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

[root@localhost~ ]# curl localhost/1.php        1541759135<>br
1541759135<>br
mjrbq0hg45dd89ttdd32bjgue9[root@localhost~ ]# telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.get mjrbq0hg45dd89ttdd32bjgue9VALUE mjrbq0hg45dd89ttdd32bjgue9TEST|i:1541759135;TEST3|i:1541759135;END

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

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

转载于:https://blog.51cto.com/8844414/2314708

你可能感兴趣的文章
Android安全问题 静音拍照与被拍
查看>>
cocos2d-x 3.1.1 学习笔记[13] listen 监听器
查看>>
WTL介绍
查看>>
应用程序框架实战三十四:数据传输对象(DTO)介绍及各类型实体比较(转)
查看>>
放量滞涨,抛出信号
查看>>
BeanFactory not initialized or already closed - call 'refresh' before accessing beans解决办法
查看>>
linux主机下的Vmware Workstation配置NAT设置 端口映射-Ubuntu为例
查看>>
unity physics joint
查看>>
TD的访问地址
查看>>
【甘道夫】Apache Hadoop 2.5.0-cdh5.2.0 HDFS Quotas 配额控制
查看>>
一张图看懂normal,static,sealed,abstract 的 区别
查看>>
Task的使用
查看>>
s:iterator巧妙控制跳出循环
查看>>
Serv-U 的升级及数据备份和迁移【转】
查看>>
webstorm无法显示左边文件夹目录的解决方法
查看>>
数字校园-云资源平台 2014.10.26-人人通共享空间
查看>>
为你的网站加上SSL,可以使用HTTPS进行访问
查看>>
软件project--谈项目开发
查看>>
在Android中创建文件
查看>>
爬虫基础
查看>>