【12.10】memrcached(下)

心已入冬 提交于 2019-12-11 07:53:50

21.5 memcached命令行

[root@arslinux-01 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set key2 0 30 2
12
STORED
set key1 0 20 3
abc
STORED
get key1
VALUE key1 0 3
abc
END
get key2
END

set key名 过期时间 value的值

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

Memcached数据示例:

set key3 1 100 4
1234
STORED
get key3
VALUE key3 1 4
1234
END
replace key3 1 0 5  
abcde
STORED
get key3
VALUE key3 1 5
abcde
END
delete key3
DELETED
get key3
END

21.6 memcached数据导出和导入

memcached 重启之前最好数据导出,待重启后再导入
导出:

[root@arslinux-01 ~]# memcached-tool 127.0.0.1:11211 dump > data.txt
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 3
Dumping bucket 1 - 3 total items

导入:

[root@arslinux-01 ~]# nc 127.0.0.1 11211 < data.txt 
NOT_STORED
NOT_STORED
NOT_STORED

之所以显示 NOT_STORED,是因为之前数据时 add 添加的,数据导入无法覆盖
因此可以重启 memcached ,清空数据后再导入

[root@arslinux-01 ~]# systemctl restart memcached
[root@arslinux-01 ~]# nc 127.0.0.1 11211 < data.txt 
STORED
STORED
STORED

不过实际上,数据并没有导入 memcached
因为 data.txt 里的时间戳已经过期

[root@arslinux-01 ~]# cat data.txt 
add k1 1 1562850422 5
12345
add name 1 1562850422 6
amings
add age 1 1562850422 2
20
[root@arslinux-01 ~]# date -d @1562850422
2019年 12月 10日 星期二 21:07:02 CST
[root@arslinux-01 ~]# date
2019年 12月 10日 星期二 22:23:49 CST

那么需要更改 data.txt 中的时间戳,之后再重新导入

[root@arslinux-01 ~]# date -d "+1 hour" +%s
1562858838
[root@arslinux-01 ~]# vim data.txt
add k1 1 1562858838 5
12345
add name 1 1562858838 6
amings
add age 1 1562858838 2
20
[root@arslinux-01 ~]# systemctl restart memcached
[root@arslinux-01 ~]# nc 127.0.0.1 11211 < data.txt
STORED
STORED
STORED
[root@arslinux-01 ~]# 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 5
12345
END
get name
VALUE name 1 6
amings
END
get age
VALUE age 1 2
20
END

21.7 php连接memcached

1、先安装 php 的 memcached 扩展

[root@arslinux-01 ~]# cd /usr/local/src/
[root@arslinux-01 src]# wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz
[root@arslinux-01 src]# tar xvf memcache-2.2.3.tgz 
package.xml
memcache-2.2.3/config.m4
memcache-2.2.3/config9.m4
memcache-2.2.3/config.w32
memcache-2.2.3/CREDITS
memcache-2.2.3/example.php
memcache-2.2.3/memcache.c
memcache-2.2.3/memcache_queue.c
memcache-2.2.3/memcache_session.c
memcache-2.2.3/memcache_standard_hash.c
memcache-2.2.3/memcache_consistent_hash.c
memcache-2.2.3/memcache.dsp
memcache-2.2.3/php_memcache.h
memcache-2.2.3/memcache_queue.h
memcache-2.2.3/README
[root@arslinux-01 src]# cd memcache-2.2.3/
[root@arslinux-01 memcache-2.2.3]# /usr/local/php-fpm/bin/phpize 		//生成 config 文件
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

出现以上错误,需要安装 autoconf ,可以 yum 安装

[root@arslinux-01 memcache-2.2.3]# yum install -y autoconf
[root@arslinux-01 memcache-2.2.3]# /usr/local/php-fpm/bin/phpize 
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
[root@arslinux-01 memcache-2.2.3]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config
[root@arslinux-01 memcache-2.2.3]# make && make install
//完成安装后,最后会有以下提示,说明模块安装的位置
Installing shared extensions:     /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
[root@arslinux-01 memcache-2.2.3]# ls /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
memcache.so  opcache.a  opcache.so

已生成 memcached.so 模块

2、编辑 php.ini 文件,添加 extension=php_memcached.dll

[root@arslinux-01 memcache-2.2.3]# vim /usr/local/php-fpm/etc/php.ini
extension=memcache.so

3、查看 php-fpm 模块是否存在

[root@arslinux-01 memcache-2.2.3]# /usr/local/php-fpm/bin/php -m|grep memcache
memcache

4、测试

[root@arslinux-01 ~]# curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null
[root@arslinux-01 ~]# 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();
?>
[root@arslinux-01 ~]# /usr/local/php-fpm/bin/php 1.php
Get key1 value: This is first value<br>Get key1 value: This is replace value<br>Get key2 value: Array
(
    [0] => aaa
    [1] => bbb
    [2] => ccc
    [3] => ddd
)
<br>Get key1 value: <br>Get key2 value: <br>[root@arslinux-01 ~]#

或者将1.php放到某个虚拟主机根目录下面,在浏览器访问,即可看到效果
最终可以看到数据如下就是成功了

21.8 memcached中存储sessions

1、下载 php 测试文件

[root@arslinux-01 ~]# wget http://study.lishiming.net/.mem_se.txt
[root@arslinux-01 ~]# cat .mem_se.txt 
<?php 
session_start(); 
if (!isset($_SESSION['TEST'])) { 
$_SESSION['TEST'] = time(); 
} 
$_SESSION['TEST3'] = time(); 
print $_SESSION['TEST']; 
print "<br><br>"; 
print $_SESSION['TEST3']; 
print "<br><br>"; 
print session_id(); 
?>

2、查看 nginx 默认虚拟主机的文件夹

[root@arslinux-01 ~]# cat /usr/local/nginx/conf/vhost/
aaa.com.conf   load.conf      proxy.conf     ssl.conf       test.com.conf  
[root@arslinux-01 ~]# cat /usr/local/nginx/conf/vhost/aaa.com.conf 
server
{
    listen 80 default_server;
    server_name aaa.com;
    index index.html index.htm index.php;
    root /data/wwwroot/default;
    location ~ \.php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/arslinux.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/default.com$fastcgi_script_name;
    }
}

3、将.mem_se.txt 拷到 /data/wwwroot/default 下

[root@arslinux-01 ~]# cd /data/wwwroot/default/
[root@arslinux-01 default]# cp /root/.mem_se.txt 1.php
[root@arslinux-01 default]# ls
1.php  index.html
[root@arslinux-01 default]# curl localhost/1.php
File not found.

查看了默认虚拟服务器配置文件,看到/data/wwwroot/default.com$fastcgi_script_name,因此目录文件名臣不对,更改名称后,正常

[root@arslinux-01 wwwroot]# mv default/ default.com/
[root@arslinux-01 wwwroot]# curl localhost/1.php
1562859350<br><br>1562859350<br><br>hldn2qa8n3kmel8tiieckqoj17
[root@arslinux-01 wwwroot]# ll /tmp/ |grep sess
-rw------- 1 php-fpm php-fpm 37 7月  11 23:35 sess_hldn2qa8n3kmel8tiieckqoj17
[root@arslinux-01 wwwroot]# curl localhost/1.php
1562859435<br><br>1562859435<br><br>593f6g4rk451qq0310840boqc0 
[root@arslinux-01 wwwroot]# ll /tmp/ |grep sess
-rw------- 1 php-fpm php-fpm 37 7月  11 23:37 sess_593f6g4rk451qq0310840boqc0
-rw------- 1 php-fpm php-fpm 37 7月  11 23:35 sess_hldn2qa8n3kmel8tiieckqoj17

4、如果不想将 session 存在 /tmp/ 下,而是存在 memcached 里
那么编辑 php.ini

[root@arslinux-01 wwwroot]# vim /usr/local/php-fpm/etc/php.ini
session.save_handler = memcache			//指定存储类型
session.save_path = "tcp://192.168.194.130:11211"	//指定 memcached 服务器的ip和端口

5、重启 php-fpm,删除 /tmp/下的 session 文件

[root@arslinux-01 wwwroot]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done
[root@arslinux-01 wwwroot]# rm -f /tmp/sess_*

6、再 curl 1.php,而 /tmp/ 下已经没有 session 文件生成了

[root@arslinux-01 wwwroot]# curl localhost/1.php
1562859940<br><br>1562859940<br><br>nf6tt9itt401oq9j7p92rf3663 
[root@arslinux-01 wwwroot]# ll /tmp/ |grep sess

7、session 存到了 memcached 里面

[root@arslinux-01 wwwroot]# curl localhost/1.php
1562860064<br><br>1562860064<br><br>52ofaaoorjjbg4n308tq80kch2

8、直接在 memcached 中查看不了,因为不知道 key
所以可以先 dump 出来,可以看到 key

[root@arslinux-01 wwwroot]# memcached-tool 127.0.0.1:11211 dump >data1.txt
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 2
Dumping bucket 3 - 2 total items
[root@arslinux-01 wwwroot]# cat data1.txt 
add 52ofaaoorjjbg4n308tq80kch2 0 1562861504 37
TEST|i:1562860064;TEST3|i:1562860064;
add nf6tt9itt401oq9j7p92rf3663 0 1562861380 37
TEST|i:1562859940;TEST3|i:1562859940;

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

php_value session.save_handler "memcache" php_value session.save_path "tcp://192.168.0.9:11211"  

或者:
php-fpm.conf 对应的pool中添加(pool 在 /usr/local/php-fpm/etc/php-fpm.d/ 下)

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

9、重新测试

[root@arslinux-01 wwwroot]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get 52ofaaoorjjbg4n308tq80kch2
VALUE 52ofaaoorjjbg4n308tq80kch2 0 37
TEST|i:1562860064;TEST3|i:1562860064;
END
get nf6tt9itt401oq9j7p92rf3663
VALUE nf6tt9itt401oq9j7p92rf3663 0 37
TEST|i:1562859940;TEST3|i:1562859940;
END

数值一致,成功!!!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!