index-wp-redis.php 4.85 KB
Newer Older
Benjamin Adams's avatar
Benjamin Adams committed
1 2
<?php

Ulrich Block's avatar
Ulrich Block committed
3 4 5
// Start the timer so we can track the page load time
$start = microtime();

6 7
function getMicroTime($time) {
    list($usec, $sec) = explode(" ", $time);
Ulrich Block's avatar
Ulrich Block committed
8 9 10
    return ((float) $usec + (float) $sec);
}

11 12 13
function refreshHasSecret($secret) {
    return isset($_GET['refresh']) && $_GET['refresh'] == $secret;
}
Ulrich Block's avatar
Ulrich Block committed
14

15 16 17
function requestHasSecret($secret) {
    return strpos($_SERVER['REQUEST_URI'],"refresh=${secret}")!==false;
}
Hendrik Klemp's avatar
Hendrik Klemp committed
18

19
function isRemotePageLoad($currentUrl, $websiteIp) {
Rueben Ramirez's avatar
Rueben Ramirez committed
20 21
    return (isset($_SERVER['HTTP_REFERER'])
            && $_SERVER['HTTP_REFERER']== $currentUrl
22 23 24
            && $_SERVER['REQUEST_URI'] != '/' 
            && $_SERVER['REMOTE_ADDR'] != $websiteIp);
}
Hendrik Klemp's avatar
Hendrik Klemp committed
25

26 27 28 29 30 31
function handleCDNRemoteAddressing() {
    // so we don't confuse the cloudflare server 
    if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
        $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
    }
}
Hendrik Klemp's avatar
Hendrik Klemp committed
32

33 34 35 36 37
function getCleanUrl($secret) {
    $replaceKeys = array("?refresh=${secret}","&refresh=${secret}");
    $url = "http://${_SERVER['HTTP_HOST']}${_SERVER['REQUEST_URI']}";
    $current_url = str_replace($replaceKeys, '', $url);
    return $current_url;
38

Benjamin Adams's avatar
Benjamin Adams committed
39
}
40 41 42

$debug                  =  true;
$cache                  =  false;
Rueben Ramirez's avatar
Rueben Ramirez committed
43
$websiteIp              =  '127.0.0.1';
44 45
$reddis_server          = '127.0.0.1';
$secret_string          =  'changeme';
Rueben Ramirez's avatar
Rueben Ramirez committed
46

47 48

handleCDNRemoteAddressing();
Hendrik Klemp's avatar
Hendrik Klemp committed
49

Vasili Pascal's avatar
Vasili Pascal committed
50 51 52
if(!defined('WP_USE_THEMES')) {
    define('WP_USE_THEMES', true);
}
Benjamin Adams's avatar
Benjamin Adams committed
53

54
$current_url = getCleanUrl($secret_string);
Ulrich Block's avatar
Ulrich Block committed
55 56 57
$redis_key = md5($current_url);

try {
Ulrich Block's avatar
Ulrich Block committed
58 59 60
    // check if PECL Extension is available
    if (class_exists('Redis')) {
        $redis = new Redis();
61

Ulrich Block's avatar
Ulrich Block committed
62
        // Sockets can be used as well. Documentation @ https://github.com/nicolasff/phpredis/#connection
63
        $redis->connect($reddis_server);
Ulrich Block's avatar
Ulrich Block committed
64
        
65
    } else { // Fallback to predis5.2.php
66
        include_once("wp-content/plugins/wp-redis-cache/predis5.2.php"); //we need this to use Redis inside of PHP
Ulrich Block's avatar
Ulrich Block committed
67 68
        $redis = new Predis_Client();
    }
69
    
Ulrich Block's avatar
Ulrich Block committed
70
    //Either manual refresh cache by adding ?refresh=secret_string after the URL or somebody posting a comment
Rueben Ramirez's avatar
Rueben Ramirez committed
71
    if (refreshHasSecret($secret_string) || requestHasSecret($secret_string) || isRemotePageLoad($current_url, $websiteIp)) {
Ulrich Block's avatar
Ulrich Block committed
72
        $redis->del($redis_key);
73
        require('./wp-blog-header.php');
Ulrich Block's avatar
Ulrich Block committed
74
        
Rueben Ramirez's avatar
Rueben Ramirez committed
75 76
        $unlimited = get_option('wp-redis-cache-debug',false);
        $seconds_cache_redis = get_option('wp-redis-cache-seconds',43200);
Ulrich Block's avatar
Ulrich Block committed
77 78
    // This page is cached, lets display it
    } else if ($redis->exists($redis_key)) {
Rueben Ramirez's avatar
Rueben Ramirez committed
79
        $cache  = true;
Ulrich Block's avatar
Ulrich Block committed
80
        $html_of_page = $redis->get($redis_key);
Rueben Ramirez's avatar
Rueben Ramirez committed
81 82
        echo $html_of_page;

Ulrich Block's avatar
Ulrich Block committed
83 84 85 86
     // If the cache does not exist lets display the user the normal page without cache, and then fetch a new cache page
    } else if ($_SERVER['REMOTE_ADDR'] != $ip_of_your_website && strstr($current_url, 'preview=true') == false) {
        
        $isPOST = ($_SERVER['REQUEST_METHOD'] === 'POST') ? 1 : 0;
87
        
Ulrich Block's avatar
Ulrich Block committed
88 89 90 91 92 93
        $loggedIn = preg_match("/wordpress_logged_in/", var_export($_COOKIE, true));
        if ($isPost == 0 && $loggedIn == 0) {
            ob_start();
            require('./wp-blog-header.php');
            $html_of_page = ob_get_contents();
            ob_end_clean();
Rueben Ramirez's avatar
Rueben Ramirez committed
94 95 96 97 98 99 100 101
            echo $html_of_page;

            if (!is_numeric($seconds_cache_redis)) {
                $seconds_cache_redis = 43200;
            }

            // When a page displays after an "HTTP 404: Not Found" error occurs, do not cache
            // When the search was used, do not cache
Hendrik Klemp's avatar
Hendrik Klemp committed
102
            if ((!is_404()) and (!is_search()))  {
Hendrik Klemp's avatar
Hendrik Klemp committed
103
                if ($unlimited) {
Rueben Ramirez's avatar
Rueben Ramirez committed
104 105 106
                    $redis->set($redis_key, $html_of_page);
                } else {
                    $redis->setex($redis_key, $seconds_cache_redis, $html_of_page);
Hendrik Klemp's avatar
Hendrik Klemp committed
107 108
                }

Ulrich Block's avatar
Ulrich Block committed
109
            }
Rueben Ramirez's avatar
Rueben Ramirez committed
110
        } else { //either the user is logged in, or is posting a comment, show them uncached
Ulrich Block's avatar
Ulrich Block committed
111
            require('./wp-blog-header.php');
112
        }
Ulrich Block's avatar
Ulrich Block committed
113 114
        
    } else if ($_SERVER['REMOTE_ADDR'] != $ip_of_your_website && strstr($current_url, 'preview=true') == true) {
115 116
        require('./wp-blog-header.php');
    }
Rueben Ramirez's avatar
Rueben Ramirez committed
117
     // else {   // This is what your server should get if no cache exists  //deprecated, as the ob_start() is cleaner
Ulrich Block's avatar
Ulrich Block committed
118 119 120
        // require('./wp-blog-header.php');
    // }
} catch (Exception $e) {
Ulrich Block's avatar
Ulrich Block committed
121
    require('./wp-blog-header.php');
Benjamin Adams's avatar
Benjamin Adams committed
122 123
}

Hendrik Klemp's avatar
Hendrik Klemp committed
124 125 126
$end  = microtime();
$time = (@getMicroTime($end) - @getMicroTime($start));
if ($debug) {
Rueben Ramirez's avatar
Rueben Ramirez committed
127 128 129 130 131 132 133
    echo "<!-- Cache system by Benjamin Adams. Page generated in " . round($time, 5) . " seconds. -->";
    echo "<!-- Site was cached  = " . $cache . " -->";
    echo "<!-- wp-redis-cache-seconds  = " . $seconds_cache_redis . " -->";
    echo "<!-- wp-redis-cache-secret  = " . $secret_string . "-->";
    echo "<!-- wp-redis-cache-ip  = " . $ip_of_your_website . "-->";
    echo "<!-- wp-redis-cache-unlimited = " . $unlimited . "-->";
    echo "<!-- wp-redis-cache-debug  = " . $debug . "-->";
Benjamin Adams's avatar
Benjamin Adams committed
134
}
Hendrik Klemp's avatar
Hendrik Klemp committed
135