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中增加如下内容

如下图,测试成功