【12.10】memrcached(下)
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
数值一致,成功!!!
来源:CSDN
作者:张森纳
链接:https://blog.csdn.net/arsenal4life/article/details/103483392