让php或httpd服务来使用memcached存储session数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了让php或httpd服务来使用memcached存储session数据相关的知识,希望对你有一定的参考价值。
memcached命令行
memcached语法
<command?name>?<key>?<flags>?<exptime>?<bytes>
?<data?block>
注:??
在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>需要存储的内容,输入完成后,最后客户端需要加上
(直接点击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,当输入完成后,最后客户端需要加上
或
表示结束标志(直接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数据
以上是个人学习中的见解,如有错误,欢迎各位请多多指教
以上是关于让php或httpd服务来使用memcached存储session数据的主要内容,如果未能解决你的问题,请参考以下文章