8月15日任务
21.5 memcached命令行
21.6 memcached数据导出和导入
21.7 php连接memcached
21.8 memcached中存储sessions
memcached命令行
如下图所示,使用telnet命令进入到命令行界面
如下图所示语法规则为<command name> <key> <flags> <exptime> <bytes> \r\n <data block> \r\n
其中flags是一个16位的无符号整数,随需要存储的数据一同存取,在get数据时会返回其值
memcached数据导入和导出
在telnet界面设置age, name, k1失效时间为永久(即不失效,为0),用memstat --servers命令查看输入输出信息
同时使用memcached-tool IP:port dump命令> xxx. txt导出,如下图
如下图重定向到data.txt中
使用nc命令导入(不存储是因为这些信息本身存在,不能再add)
重启memcached则可以导入(因为数据存在缓存中,一旦重启,则数据会消失)
如上图,虽然在memcached服务重启后显示导入成功,telnet进入后get命令却无法显示这些参数的值,这是因为我们导出来的数据是带有时间戳的,如下图该时间戳是过去时间(在该时间点会过期)
再次重启memcached服务,查看是否有数据
如下图,date -d "+1 hour" +%s 显示当前时间下一小时的时间戳,防止过期
修改data.txt,把第一个参数设置成当前时间下一小时的时间戳,第三个设置成1000
再次实验,导入并测试成功(其中需要注意的是系统自己有一个过期时间,在telnet界面设置的exptime虽然为0表示永久不过期,但是一旦导出代表这个参数立即过期,在导入的时候需要以当前的时间为基准顺延若干分钟,才能保证系统认为这些数据还没有过期,因为导出的时候有一个系统自带的过期时间戳)
php连接memcached
php中有许许多多的模块,如之前编译安装的mysql, mysqli等模块,同样的道理;要实现php和memcached的关联需要memcache模块作为中间件,载体
现在memcache模块包,tar zxvf打包解压,由于没有configure文件需要/usr/local/php-fpm/bin/phpize生成一个configure文件,然后在当前文件夹和php一起编译安装./configure --with-php-config=/usr/local/php-fpm/bin/php-config
make & make install如下图发现一个新的memcache.so模块
编辑/usr/local/php-fpm/etc/php.ini把memcache.so模块加入,如下图并用-m命令查看是否成功
下载php脚本进行测试
直接使用命令行测试:/usr/local/php-fpm/bin/php 1.php (也可以把1.php放到某虚拟主机根目录下,在浏览器中访问,查看效果)
memcached中存储session
应用场景:无法把用户登录状态保持在某服务器上,此时可以把session不再存到磁盘上,而是存到memcached中,memcached可以作为一个公共服务器,在访问时使用其中某个内网IP,而不是127.0.0.1
回到php.ini文件,找到session相关配置其中session.save handler=files也就是说默认存在本地的/tmp/下,下载一个存session的php脚本进行测试
找到LNMP架构下的默认主机
转到网站根目录下并把之前下载的mem_se.txt 移动到根目录下并重命名为1.php,curl localhost/1.php发现session存在了/tmp/下
把session转到memcached下,需要修改配置文件php.ini中的session,重新定义如下图
重启php服务后,再次执行curlhost/1.php多次,发现/tmp下并没有生成新的session会话,然后再测试session是否写入memcached中,由于curl localhost/1.php只显示value没有key,而telnet不支持keys * 操作查看value,所以使用memcached-tool 127.0.0.1:11211 dump > data.txt导出数据然后cat 查看,发现测试失败
其他测试方法, 需要修改如下配置文件中的参数,LAMP修改httpd.conf, LNMP修改对应的pool配置文件
测试如下图,在liut.conf pool中增加如下内容
如下图,测试成功