PHP与Memcached

Memcached是一个开源、高性能且支持分布式的内存数据库系统,其以key-value的键值对方式存储数据于内存之中,存储的值可以是任何字符串,另外它提供了精简的API,可对接不同的开发语言。由于Memcached使用了内存作为数据存储容器,性能非常高效,被广泛应用于缓存方案中。当然类似的数据库还有Redis。本次内容主要介绍利用Docker部署Memcached以及Memcached与本地PHP的对接技巧。

在Docker中部署Memcached

本次的实验环境是在Windows 10系统下完成,由于Memcached原本就是在Linux运行的,虽然也有Windows版本,但是不太好,所以我选择了用Docker来部署。前一篇介绍Docker的文章已经大概讲解了怎样在Windows中安装Docker,但稍微有点区别,本次我使用的Docker为Docker for Windows,安装方式比Docker ToolBox要简单,也是官方推荐使用的Windows下的Docker解决方案。具体的安装方法可以到官方下载Docker for Windows CE,像普通软件一样安装就行了,安装完成需要开启Windows的Hyper-V虚拟机才可以使用,如果您的操作系统没有Hyper-V,就没法支持。具体的安装步骤就略了。

首先我们需要拉取Memcached镜像到本地,这次我选择了网易蜂巢镜像中心http://c.163.com,当然也可以选daocloud的镜像市场。在网易蜂巢中心搜索memcached,之后我们可以提到官方提供的镜像拉取地址,我选择了最新版本

镜像市场

1
docker pull hub.c.163.com/library/memcached:latest

将拉取命令复制到命令行中执行,等待镜像下载完成。镜像下载完成后,我们可以用docker images命令来查看本地镜像,可以看到memcached的镜像已经在列表之中了。

1
2
3
4
PS C:\Users\sunfl> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
daocloud.io/library/nginx latest 5766334bdaa0 2 weeks ago 183 MB
hub.c.163.com/library/memcached latest deb4e908c6ae 5 weeks ago 83.1 MB

查看镜像

之后我们可以尝试着启动一个运行memcached的容器进行链接测试。

1
docker run -d -p 11211:11211 hub.c.163.com/library/memcached -m 64

以上命令的意思是启动一个hub.c.163.com/library/memcached的容器,把容器的端口映射到本地的11211端口,这样本地就能访问到memcached了,-d表示后台运行,-m指定分配给memcached的内存数量,以MB为单位。

运行成功之后docker会返回容器的id。

由于我使用的是Windows操作系统,在Windows下访问Memcached可以使用telnet客户端,Windows10的telnet客户端默认是关闭的,我们可以在控制面板-程序-卸载程序-打开或关闭Windows功能中找到Telnet客户端勾选并确认。

打开cmd命令行窗口,使用telnet连接docker容器中的memcached。

1
telnet 127.0.0.1 11211

按下回车键,如果连接成功,telnet就会进入空白(没有字的纯黑界面也是空白-_-)的界面等待用户输入命令。连接成功后随便输入一条存储数据的命令测试:

1
2
3
4
5
6
7
8
9
set key 0 1000 10
memcached
STORED
get memcached
END
get key
VALUE key 0 4
test
END

我们在上面输入了set key 0 1000 10意思是设置一个key为key的键,超时时间为1000秒,字节大小为10。回车之后,memcached等待用户输入值,这里输入memcached作为值,再次回车,如果保存成功,终端会输出STORED,否则输出ERROR,取值的命令则是通过get KEY的值来获取key对应的值,可以使用quit断开连接。到此算是测试成功了,具体的Memcached命令就不再多讲。

PHP的Memcache扩展安装

PHP并不是默认支持Memcached,我们需要为它安装Memcache扩展才能正常连接Memcache。

下载扩展可以到PHP扩展官方pecl下载,Memcached扩展的下载地址为http://pecl.php.net/package/memcache需要根据自己的PHP环境选择。

扩展的选择一般需要看PHP构建的环境,比如编译平台、64位还是32位和是否线程安全等。

如何查看这些信息呢?可以通过phpinfo()函数输出的信息查看

PHP构建信息

根据以上的信息,我选择了基于VC11编译、64位平台且是线程安全的版本,TS代表线程安全(Thread Safety)。

Memcache扩展

把下载好的扩展解压可以看到里面有一个动态链接库文件php_memcache.dll这就是Windows下的php扩展。复制放到PHP目录下的ext文件夹,然后在php.ini配置文件中开启扩展声明。

php.ini配置文件

我用到是WAMPServer集成环境,可以通过它来跳转到PHP的配置文件,在配置文件中添加如下声明:

1
extension=php_memcache.dll

之后需要重启apache重新加载PHP才能是扩展生效。配置完成之后,我们用phpinfo()函数输出查看扩展是否已经安装成功,如果出现了memcache,说明安装非常顺利。

测试

折腾了那么久,让我们来写几句php的代码操作一下Memcached吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
//实例化Memcache对象
$mem =new Memcache();
//连接Memcached服务器,失败返回false
$mem->connect('127.0.0.1', '11211') or die('Connected failed!');
//存储一个值
$mem->set('k_name', 'oopsguy');
//取出并输出一个值
echo $mem->get('k_name');
//删除数据
$mem->delete('k_name');
//验证值数据是否存在
var_dump($mem->get('k_name'));
//关闭连接
$mem->close();

以上是一个简单php操作Memcached代码,跟多的API可以参照PHP官方文档。

让我们开看看输出结果是否符合预期:

1
2
oopsguy
E:\wamp64\www\memcached.php:13:boolean false

完全没问题。

但这样的还不够,我们需要在PHP中设置存储数据,让后通过telnet客户端查看对应的数据是否存在。

1
2
3
4
5
<?php
$mem =new Memcache();
$mem->connect('127.0.0.1', '11211') or die('Connected failed!');
$mem->set('k_name', 'oopsguy');
$mem->close();

执行之后,进入telnet终端查看数据是否存在:

telnet终端数据情况

可以看到终端获取到了数据。

总结

以上介绍了如何在Docker环境下部署一个Memcached容器,之后通过本地PHP连接容器操作Memcached,算是一个比较基础的教程,更深入更复杂的操作还是需要自己研究。