Windows下启用memcache缓存所走的弯路

看了水煮鱼的博客(WordPress 如何启用 Memcached 内存缓存来提高网站速度 – WordPress 果酱 https://blog.wpjam.com/article/wordpress-memcached/),有提到使用memcached来缓存系统达到提升wordpress性能的效果。然后看到他的网站是页面生成时间不用1ms,看看自己的100-300多ms,差距不是一点点,而是不是在2个层级上的。抱着学习的态度,希望也能稍微加快点进度,以便提高网站的速度。

图1.未开启的查询状态

另外也一直存在Waiting TTFB时间过长的情况,虽然没有到500ms,但也是无限的接近了。

图2. waiting TTFB时间过长的情况

于是开始启动,按照网上的教程操作起来。

首先就发现了有memcachememcached 的区别,这点也是花了非常多的时间才弄明白,而网上大部分的资讯都近似于模棱两可的状态。经过了摸索,大概确定了如下情况:

1、memcache 跟memcached 都是支持PHP的高性能的分布式内存对象缓存系统,支持MySQL数据库。

2、memcache同时支持Windows系统跟Linux系统,但memcached仅在Linux下工作。【此处存疑,但找了好久还是没有发现有Windows下的memcached,因此只能退而求其次使用memcache了】

3、memcache 跟memcached 都需要一个服务端或者进程在后台运行,同时需要对应的PHP扩展生效。2个扩展需要对应,交叉是无法发挥作用的。

4、memcache 跟memcached 使用的默认端口类似,前者是11211,后者是11311。

5、memcache需要运行的可执行文件就是memcached.exe,Memcache的服务在系统中加载为Memcached,但实际又跟Memcached系统无关。这就是非常容易让人混淆的地方。误以为memcached.exe都在正常运行了,就一定是memcached扩展。

网上太多的文章混淆了二者的区别,例如 Memcached 教程 | 菜鸟教程 http://www.runoob.com/memcached/memcached-tutorial.html ,这里讲述介绍的是Memcached,但在安装跟连接的环节,提供的方案完全是Memcache,毫无吻合。

下面简述下按网上提供的教程在Windows下安装使用Memcache的过程,其中也有一些弯路,在此记录下来,便于下次直接过桥而不是摸着石头过河。

1、在网上下载Memcache的服务器端,即exe 这个可执行文件。这个基本上到处都有,可以在刚才提到的网页中下载。目前分1.4.4跟1.4.5两个版本,前者支持加入服务自动启动,后者需要开启计划任务来保持开机运行。当前使用1.4.4版,使用服务加载比较简单、稳定。

2、在本机运行Memcached.exe,并注册服务。将压缩包解压后得到exe文件,放到固定的位置后,以管理员权限开启CMD命令提示符,输入命令:memcached.exe -d install ,没有任何提示则已经成功。

如果提示:failed to install service or service already installed ,则检查是否使用了管理员权限。

3、检测Memcache服务运行情况,可以在任务管理器中看到Memcached服务已经开启。同时可以通过telnet 方式连接本地的服务,查看运行的状态。

图3.任务管理器中看到memcached服务已在运行中

在命令提示符窗口输入 telnet 127.0.0.1 11211 ,正常情况下会一晃而过的连接中,即出现黑屏。回车会提示ERROR,则表示已经连接成功。

图4.telnet连接本地的memcache

输入state 可以看到目前服务的状态,进程ID,版本、命中、等状态。

图5.telnet输入命令stats后显示的状态

4、找PHP的Memcache的扩展。话说在这里也是花了不少的时间,为什么呢?因为毕竟Memcache是一个非常老的系统了,已经有长期没有更新,目前在PHP的官方网站上可以找到的最新的已经是2013年的3.0.8版,其中的DLL文件仅支持PHP到5.6,而服务器上运行的PHP已经在7以上了。网站并没有收录7及以后的DLL文件。网页是http://pecl.php.net/package/memcache/3.0.8/windows

图6.PHP网站上的最新memcache扩展
图7.php.dll的windows支持情况

也算是找了好久,峰回路转,终于在github找到了,要不然怎么说是代码的仓库呢?具体的网址是 GitHub – nono303/PHP7-memcache-dll: PHP7-memcache-dll https://github.com/nono303/PHP7-memcache-dll,这里就分门别类做的非常的齐全。按照PHP的版本、系统的版本、是否安全线程都做了非常好的分类。方便后续的使用,花了点时间做了搬运,打包放到了百度云盘上(提取码bw72)。

5、激活PHP扩展。既然已经找到了扩展DLL文件,那么按指引操作吧。先把php-7.1.x_memcache.dll 复制到PHP的ext文件夹下面,然后再到PHP.ini文件中加上:extension=php-7.1.x_memcache.dll,大约在900行的样子有一堆的extension= 。保存后重启Apache ,打开一段验证代码的文件。代码如下,另存为PHP文件即可。

<?php

phpinfo();

?>

<?php

$mem = new Memcache;

$mem->connect(‘127.0.0.1’,11211)or die(“连接失败”);

$mem->set(‘key’, ‘This is a test!’, 0, 60);

$val = $mem->get(‘key’);

echo $val;

echo “<br/>version:”.$mem->getVersion();

?>

然后不出意外的提示:Fatal error: Uncaught Error: Class ‘Memcache’ not found in【文件路径】.php:6 Stack trace: #0 {main} thrown in 【文件路径】.php on line 6

于是又到网上找答案,这个倒是简单,都提示是因为dll的版本不对问题。Dll的版本主要涉及到三个方面,PHP的编译版本(VC14.15.16)、PHP版本(7.0,7.1,7.2),是否安全线程(NTS、TS)、操作系统版本(X86、X64)。前三个都可以通过phpinfo();的这个函数得到。Compiler   MSVC14 (Visual C++ 2015),Thread Safety     disabled,

PHP Version  7.1.15 ,选VC14,NTS,7.1.x这个dll文件就行了,操作系统服务器版的肯定是X64的64位系统了,肯定没有人在服务器用32位的系统了吧。然后怎么样,怎么样都是不对,总是返回这样一个结果,简直让人崩溃了。

网上给出的答案,都指向了版本的问题,那么版本的问题是什么?4个选项,都选择对了,为什么还是提示出错呢?

也算是灵光一闪,再继续查看phpinfo()的页面时候,突然看到了显示的架构是x86!!

图8.php信息中显示的architecture是x86

这?完全颠覆了一直的认知,既然如此,那么换x86的,不用x64的。替换,重启Apache,刷新页面,居然成功了

图9 .测试成功返回信息
图10 memcache启用情况

这为什么呢?真百思不得其解。

启用了之后在刷新看看有没有效果。发现还是依然如故,查询时长0.178s,waiting ttfb时间还是500ms左右。看来问题并非使用缓存来解决了。

觉得可能是服务器虚拟主机的原因,所以是x86架构的。后来在本地电脑上也进行了测试,发现架构依然是x86,明明系统是64位的系统。看来这里的可能是另外一种标准了,有待后续来解决了。