Redis为wordpress提供闪存级加速体验 绝佳的缓存加速方案

自然
自然
自然
296
文章
304
评论
2018年2月7日18:26:11 3 3623字阅读12分4秒

Redis 是一个高级的 key-value 存储系统,类似 memcached,所有内容都存在内存中,因此每秒钟可以超过 10 万次 GET 操作、访问。

我下面介绍的解决方案是在 Redis 中缓存所有输出的 HTML 内容而无需再让 WordPress 重复执行页面脚本。这里使用 Redis 代替 Varnish 设置简单,而且可能更快。

Redis为wordpress提供闪存级加速体验 绝佳的缓存加速方案

为wordpress提供闪存级加速体验方案,实现良好的用户体验

 

安装Redis

  1. yum install -y redis     #前提是你的repo源中存在redis安装包

使用 Predis 作为 Redis 的 PHP 客户端

我们需要一个程序作为redis的客户端,可以理解为服务器的中间文件,将php与redis相互链接。这里推荐predis,一个非常不错的开源程序。

项目地址:https://packagist.org/packages/predis/predis

把predis.php放到wordpress根目录下

前端缓存的 PHP 脚本

步骤1: 在 WordPress 的根目录创建新文件 index-with-redis.php ,内容如下:

  1.  <?php
  2. // Change these two variables:
  3. $seconds_of_caching = 60*60*24*7; // 7 days.
  4. $ip_of_this_website = '204.62.14.112';
  5. /*
  6. - This file is written by Jim Westergren, copyright all rights reserved.
  7. - See more here: www.jimwestergren.com/wordpress-with-redis-as-a-frontend-cache/
  8. - The code is free for everyone to use how they want but please mention my name and link to my article when writing about this.
  9. - Change $ip_of_this_website to the IP of your website above.
  10. - Add ?refresh=yes to the end of a URL to refresh it's cache
  11. - You can also enter the redis client via the command prompt with the command "redis-cli" and then remove all cache with the command "flushdb".
  12. */
  13. // Very necessary if you use Cloudfare:
  14. if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
  15. $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
  16. }
  17. // This is from WordPress:
  18. define('WP_USE_THEMES', true);
  19. // Start the timer:
  20. function getmicrotime($t) {
  21. list($usec$sec) = explode(" ",$t);
  22. return ((float)$usec + (float)$sec);
  23. }
  24. $start = microtime();
  25. // Initiate redis and the PHP client for redis:
  26. include("predis.php");
  27. $redis = new Predis\Client('');
  28. // few variables:
  29. $current_page_url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
  30. $current_page_url = str_replace('?refresh=yes', ''$current_page_url);
  31. $redis_key = md5($current_page_url);
  32. // This first case is either manual refresh cache by adding ?refresh=yes after the URL or somebody posting a comment
  33. if (isset($_GET['refresh']) || substr($_SERVER['REQUEST_URI'], -12) == '?refresh=yes' || ($_SERVER['HTTP_REFERER'] == $current_page_url && $_SERVER['REQUEST_URI'] != '/' && $_SERVER['REMOTE_ADDR'] != $ip_of_this_website)) {
  34. require('./wp-blog-header.php');
  35. $redis->del($redis_key);
  36. // Second case: cache exist in redis, let's display it
  37. else if ($redis->exists($redis_key)) {
  38. $html_of_current_page = $redis->get($redis_key);
  39. echo $html_of_current_page;
  40. echo "<!-- This is cache -->";
  41. // third: a normal visitor without cache. And do not cache a preview page from the wp-admin:
  42. else if ($_SERVER['REMOTE_ADDR'] != $ip_of_this_website && strstr($current_page_url, 'preview=true') == false) {
  43. require('./wp-blog-header.php');
  44. $html_of_current_page = file_get_contents($current_page_url);
  45. $redis->setex($redis_key$seconds_of_caching$html_of_current_page);
  46. echo "<!-- Cache has been set -->";
  47. // last case: the normal WordPress. Should only be called with file_get_contents:
  48. else {
  49. require('./wp-blog-header.php');
  50. }
  51. // Let's display some page generation time (note: CloudFlare may strip out comments):
  52. $end = microtime();
  53. $t2 = (getmicrotime($end) - getmicrotime($start));
  54. if ($_SERVER['REMOTE_ADDR'] != $ip_of_this_website) {
  55. echo "<!-- Cache system by Jim Westergren. Page generated in ".round($t2,5)." seconds. -->";
  56. }
  57. ?>

步骤2:将上述代码中的 IP 地址替换成你网站的 IP 地址

步骤3:在 .htaccess 中将所有出现 index.php 的地方改为 index-with-redis.php ,如果你使用的是 Nginx 则修改 nginx.conf 中的 index.php 为 index-with-redis.php(并重载 Nginx : killall -s HUP nginx)。

性能测试

  • 没有 Redis 的情况下,平均首页执行 1.614 秒,文章页 0.174 秒(无任何缓存插件)
  • 使用 Redis 的情况下,平均页面执行时间 0.00256 秒

我已经在我的博客中使用了如上的方法进行加速很长时间了,一切运行良好。

其他建议

我的网站环境是Nginx -Tengine2.2 、 PHP-FPM 、PHP7、 Mysql5.6、Redis,无缓存插件。

再为网站开启Gzip加速就非常完美了

访问 wp-admin

有一点需要特别注意,要访问 wp-admin 必须使用 /wp-admin/index.php 代替原来的 /wp-admin/.

继续阅读
weinxin
网科文媒
快来关注一下,你想要的这里都有喔!
自然
  • 文本由 发表于 2018年2月7日18:26:11
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
TinyPNG图片压缩服务,让你的网站快人一步 免费资源

TinyPNG图片压缩服务,让你的网站快人一步

我们对网站优化基本思路都是缓存、减少请求、静态分离和压缩大小等方面入手,今天就来说一下压缩文件尺寸方面的问题。影响网站体验效果的主要因素之一就是加载时间问题,服务器宽带、路由线路、加载体积。服务器宽带...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:3   其中:访客  2   博主  1
    • avatar 青山 @回复 1

      这玩意占用运行内存太大了

        • avatar 自然 Admin @回复

          @青山 个人站不会占用太多内存,如果需求大可以进行优化,以快照的形式存储到磁盘

        • avatar 上海一芦居 @回复 1

          靠谱的教程,比那些互相抄袭的好多了