`

让 WordPress 使用 Redis 缓存来进行加速

 
阅读更多

原文 http://www.oschina.net/question/12_60107

 

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

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

安装 Redis

如果你使用的是 Debian 或者衍生的操作系统可使用如下命令安装 Redis:

1 apt-get install redis-server

 

或者阅读 安装指南

使用 Predis 作为 Redis 的 PHP 客户端

你需要一个客户端开发包以便 PHP 可以连接到 Redis 服务上。

这里我们推荐 Predis. 上传 predis.php 到 WordPress 的根目录。

前端缓存的 PHP 脚本

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

001 <?php
002  
003 // Change these two variables:
004  
005 $seconds_of_caching = 60*60*24*7; // 7 days.
006  
007 $ip_of_this_website = '204.62.14.112';
008  
009   
010  
011 /*
012  
013 - This file is written by Jim Westergren, copyright all rights reserved.
014  
015 - See more here: www.jimwestergren.com/wordpress-with-redis-as-a-frontend-cache/
016  
017 - 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.
018  
019 - Change $ip_of_this_website to the IP of your website above.
020  
021 - Add ?refresh=yes to the end of a URL to refresh it's cache
022  
023 - 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".
024  
025 */
026  
027   
028  
029 // Very necessary if you use Cloudfare:
030  
031 if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
032  
033 $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
034  
035 }
036  
037   
038  
039 // This is from WordPress:
040  
041 define('WP_USE_THEMES', true);
042  
043   
044  
045 // Start the timer:
046  
047 function getmicrotime($t) {
048  
049 list($usec, $sec) = explode(" ",$t);
050  
051 return ((float)$usec + (float)$sec);
052  
053 }
054  
055 $start = microtime();
056  
057   
058  
059 // Initiate redis and the PHP client for redis:
060  
061 include("predis.php");
062  
063 $redis = new Predis\Client('');
064  
065   
066  
067 // few variables:
068  
069 $current_page_url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
070  
071 $current_page_url = str_replace('?refresh=yes', '', $current_page_url);
072  
073 $redis_key = md5($current_page_url);
074  
075   
076  
077 // This first case is either manual refresh cache by adding ?refresh=yes after the URL or somebody posting a comment
078  
079 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)) {
080  
081 require('./wp-blog-header.php');
082  
083 $redis->del($redis_key);
084  
085   
086  
087 // Second case: cache exist in redis, let's display it
088  
089 } else if ($redis->exists($redis_key)) {
090  
091 $html_of_current_page = $redis->get($redis_key);
092  
093 echo $html_of_current_page;
094  
095 echo "<!-- This is cache -->";
096  
097   
098  
099 // third: a normal visitor without cache. And do not cache a preview page from the wp-admin:
100  
101 } else if ($_SERVER['REMOTE_ADDR'] != $ip_of_this_website &&strstr($current_page_url, 'preview=true') == false) {
102  
103 require('./wp-blog-header.php');
104  
105 $html_of_current_page = file_get_contents($current_page_url);
106  
107 $redis->setex($redis_key, $seconds_of_caching, $html_of_current_page);
108  
109 echo "<!-- Cache has been set -->";
110  
111   
112  
113 // last case: the normal WordPress. Should only be called with file_get_contents:
114  
115 } else {
116  
117 require('./wp-blog-header.php');
118  
119 }
120  
121   
122  
123   
124  
125 // Let's display some page generation time (note: CloudFlare may strip out comments):
126  
127 $end = microtime();
128  
129 $t2 = (getmicrotime($end) - getmicrotime($start));
130  
131 if ($_SERVER['REMOTE_ADDR'] != $ip_of_this_website) {
132  
133 echo "<!-- Cache system by Jim Westergren. Page generated in ".round($t2,5)." seconds. -->";
134  
135 }
136  
137 ?>

 

或者直接下载 index-with-redis.php

步骤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 + PHP-FPM + APC + Cloudflare + Redis. 安装在一个 nano VPS 中,无缓存插件。

请确认使用了 gzip 压缩,可加快访问速度。

访问 wp-admin

要访问 wp-admin 必须使用 /wp-admin/index.php 代替原来的 /wp-admin/.

英文原文OSCHINA原创翻译

分享到:
评论

相关推荐

    基于PHP的Wordpress专用Redis缓存系统.zip

    【标题】基于PHP的Wordpress专用Redis缓存系统 在WordPress这样的大型CMS(内容管理系统)中,随着网站规模的增长,数据库性能成为影响网站响应速度的关键因素。为了优化性能,开发者通常会采用缓存技术,而Redis...

    基于PHP的Wordpress专用Redis缓存系统源码.zip

    在WordPress环境中,PHP不仅用于处理页面逻辑,还用于与MySQL数据库交互,现在,通过这个Redis缓存系统,PHP还能与Redis进行高效通信。 【压缩包子文件的文件名称列表】132699022652356194 由于压缩包内的具体...

    wordpress加速缓存插件Redis Object CacheV2.4.4

    今天给大家带来wordpress开启redis缓存 加速速度仅需0.1秒,不开玩笑真的非常有效,wordpress在数据比较大的情况下表现为慢吞吞。原因就是不断的对数据库的查询造成的,怎么才能减少MYSQL数据库负担呢?那么就是需要...

    Wordpress 非插件Redis缓存 v1.3

    这是一个非插件版针对Wordpress开发的Redis缓存系统。为了进一步提高处理速度,系统采用纯PHP代码,没有引入WP核心文件。功能介绍:可定义某些页面跳过缓存。已登录用户跳过缓存。支持手动清除缓存,可配合crontab定时...

    加速WordPress技巧:Redis缓存输出的HTML页面

    实施Redis缓存的步骤大致如下: 1. 安装Redis服务:对于使用Debian或其衍生操作系统的用户,可以通过apt-get install redis-server命令安装Redis服务器。安装后,可以使用redis-server启动服务,并确保它能够正常...

    Wordpress Redis缓存 v1.2

    这是一个非插件版针对Wordpress开发的Redis缓存系统啊也不算系统. 为了进一步提高处理速度系统采用纯PHP代码没有引入WP核心文件. 设计原理: 当用户访问某一个页面时将整页写入到

    wp-redis:使用Redis的WordPress对象缓存

    WP Redis 使用Redis的WordPress对象缓存。 由Alley Interactive提供。先决条件 设置将object-cache.php安装到wp-content/object-cache.php 。 在wp-config.php文件中,添加服务器凭据: $redis_server = array( '...

    Wordpress 非插件Redis缓存

    这是一个非插件版针对Wordpress开发的Redis缓存系统。 为了进一步提高处理速度,系统采用纯PHP代码,没有引入WP核心文件。 功能介绍: 可定义某些页面跳过缓存。 已登录用户跳过缓存。 支持手动清除缓存,可配合...

    WordPress静态加速插件:果果加速

    支持设置缓存方式,是使用文件缓存还是Redis缓存或者Memcache缓存。 可以设置页面内容的缓存有效期。 友好的错误提示文字,让您轻松设置Redis缓存或者Memcache缓存。 支持配置指定GET\COOKIE参数缓存,排除页面...

    Wordpress 非插件Redis缓存源代码

    这是一个非插件版针对Wordpress开发的Redis缓存系统。 为了进一步提高处理速度,系统采用纯PHP代码,没有引入WP核心文件。 功能介绍: 可定义某些页面跳过缓存。 已登录用户跳过缓存。 支持手动清除缓存,可配合crontab...

    WordPress果果加速插件

    支持设置缓存方式,是使用文件缓存还是Redis缓存或者Memcached缓存。 可以设置页面内容的缓存有效期。 友好的错误提示文字,让您轻松设置Redis缓存或者Memcached缓存。 支持配置指定GET\COOKIE参数缓存,排除页面...

    pj-page-cache-red:用于WordPress的Redis支持的全页缓存插件

    用于WordPress的Redis页面缓存 由Redis支持的用于WordPress的全页缓存插件,非常灵活和快速。 需要运行的和扩展。 要求 确保您具有正在运行的Redis服务器,并且PECL PHP Redis扩展已安装并处于活动状态。 两者都可以...

    redis-cache:由Redis支持的WordPress持久对象缓存后端。 支持Predis,PhpRedis,Credis,HHVM,复制和群集

    为原始性能重写100%符合WordPress API 更快的序列化和压缩轻松调试和记录缓存预取和分析完全经过单元测试(100%代码覆盖率) 使用TLS的安全连接通过WordPress和WP CLI进行健康检查针对WooCommerce,Jetpack和...

    Redis的5个常见使用场景.docx

    例如,Magento 提供了一个插件来使用 Redis 作为全页缓存后端。 Pantheon 也提供了一个插件 wp-redis,用于将 WordPress 网站缓存在 Redis 中。 3. 队列 Redis 还可以用于队列操作,例如消息队列、任务队列等。...

    pj-object-cache-red:您会发现最快的WordPress Redis对象缓存

    总览一个高效,可预测且经过单元测试的WordPress对象缓存后端,可使用Redis PECL库实现所有可用方法。为什么这个叉子更好? 通过单个mget()调用预加载已知的缓存键,并进行延迟反序列化进一步的微优化例程使其成为最...

    Java面试redis.pdf

    - 全页缓存:Redis 可以作为全页缓存系统,加速网页的加载速度,尤其适用于 Magento 和 WordPress 等网站。 - 队列:利用 List 数据结构,Redis 可以实现消息队列功能,如 Celery 使用 Redis 作为其后台消息代理。...

    wordpress-opcache:用于WordPress的OPcache对象缓存插件。 比Redis,Memcache或APC更快

    WordPress的OPcache对象缓存插件。 比Redis,Memcache或APC更快。 描述 该插件为WordPress对象缓存提供了一个基于PHP OPcache的驱动程序。 对象缓存是WordPress和WordPress扩展存储复杂操作结果的地方。 在随后的...

Global site tag (gtag.js) - Google Analytics