zoukankan      html  css  js  c++  java
  • 让WORDPRESS使用REDIS缓存来进行加速

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

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

    安装 Redis

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

    apt-get install redis-server

    或者阅读 安装指南

    使用 Predis 作为 Redis 的 PHP 客户端

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

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

    前端缓存的PHP脚本

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

    <?php

    // Change these two variables:

    $seconds_of_caching = 60*60*24*7; // 7 days.

    $ip_of_this_website = ‘204.62.14.112’;

    /*

    – This file is written by Jim Westergren, copyright all rights reserved.
    – See more here: www.jimwestergren.com/wordpress-with-redis-as-a-frontend-cache/
    – 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.
    – Change $ip_of_this_website to the IP of your website above.
    – Add ?refresh=yes to the end of a URL to refresh it’s cache
    – 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”.

    */

    // Very necessary if you use Cloudfare:

    if (isset($_SERVER[‘HTTP_CF_CONNECTING_IP’])) {
    $_SERVER[‘REMOTE_ADDR’] = $_SERVER[‘HTTP_CF_CONNECTING_IP’];
    }

    // This is from WordPress:

    define(‘WP_USE_THEMES’, true);

    // Start the timer:

    function getmicrotime($t) {
    list($usec, $sec) = explode(” “,$t);
    return ((float)$usec + (float)$sec);
    }

    $start = microtime();

    // Initiate redis and the PHP client for redis:

    include(“predis.php”);
    $redis = new PredisClient(”);

    // few variables:

    $current_page_url = “http://”.$_SERVER[‘HTTP_HOST’].$_SERVER[‘REQUEST_URI’];

    $current_page_url = str_replace(‘?refresh=yes’, ”, $current_page_url);

    $redis_key = md5($current_page_url);

    // This first case is either manual refresh cache by adding ?refresh=yes after the URL or somebody posting a comment

    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)) {
    require(‘./wp-blog-header.php’);
    $redis->del($redis_key);

    // Second case: cache exist in redis, let’s display it

    } else if ($redis->exists($redis_key)) {

    $html_of_current_page = $redis->get($redis_key);

    echo $html_of_current_page;

    echo “<!– This is cache –>”;

    // third: a normal visitor without cache. And do not cache a preview page from the wp-admin:

    } else if ($_SERVER[‘REMOTE_ADDR’] != $ip_of_this_website && strstr($current_page_url, ‘preview=true’) == false) {
    require(‘./wp-blog-header.php’);
    $html_of_current_page = file_get_contents($current_page_url);
    $redis->setex($redis_key, $seconds_of_caching, $html_of_current_page);
    echo “<!– Cache has been set –>”;

    // last case: the normal WordPress. Should only be called with file_get_contents:

    } else {
    require(‘./wp-blog-header.php’);
    }

    // Let’s display some page generation time (note: CloudFlare may strip out comments):

    $end = microtime();
    $t2 = (getmicrotime($end) – getmicrotime($start));
    if ($_SERVER[‘REMOTE_ADDR’] != $ip_of_this_website) {
    echo “<!– Cache system by Jim Westergren. Page generated in “.round($t2,5).” seconds. –>”;
    }
    ?>

    步骤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)。

    性能测试

    1.没有Redis 的情况下,平均首页执行1.614 秒,文章页0.174 秒(无任何缓存插件)

    2.使用Redis 的情况下,平均页面执行时间0.00256秒

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

    其他建议

    我的环境是Nginx + PHP-FPM + APC + Cloudflare + Redis. 安装在一个 nano VPS 中,无缓存插件。

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

    访问 wp-admin

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

  • 相关阅读:
    创建类以及引用一个类
    修改hosts文件
    微信第三方登录接口开发
    Android定位
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 725. Split Linked List in Parts
    Leetcode 445. Add Two Numbers II
    Leetcode 328. Odd Even Linked List
    Leetcode 237. Delete Node in a Linked List
    Leetcode 234. Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/surplus/p/12400363.html
Copyright © 2011-2022 走看看