0°

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

wordprss小白,纯记录学习实践的过程。

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

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

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

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

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 方式连接本地的服务,查看运行的状态。

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

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

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

也算是找了好久,峰回路转,终于在 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 文件即可。

phpinfo();


?>



$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 “
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!!

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

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

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

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

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
5 条回复 A 作者 M 管理员
  1. 其实,现在我倒是不建议大家随意的使用Memcached来加速,这个加速的效果其实对于前段来说并没有想象的那么大!

    • 是的,效果不明显。或者说几乎没有作用。

  2. 相信明月大佬的!

  3. 缓存插件的使用要看情况的,不是谁都可以用的!

  4. 缓存插件和扩展一般都是救急的,并不建议长期使用,除非服务器上有比较安全的防御策略和及时的漏洞修补!
    否则就是招蜂引蝶!

欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论