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

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

function getMicroTime($t)
{
    list($usec, $sec) = explode(" ", $t);
    return ((float) $usec + (float) $sec);
}

12
$seconds_cache_redis = 60 * 60 * 12; // 12 hours by default, you can change in this in wp-admin options page
Ulrich Block's avatar
Ulrich Block committed
13
$ip_of_your_website  = '127.0.0.1'; //You must set this to the IP of your website
14
15
16
17
$secret_string       = "changeme";
/*This is if you want to manually refresh the cache
ex: http://example.com/sample-post?refresh=changeme    */

Benjamin Adams's avatar
Benjamin Adams committed
18
19
// so we don't confuse the cloudflare server 
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
20
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
Benjamin Adams's avatar
Benjamin Adams committed
21
22
23
}

define('WP_USE_THEMES', true);
24
25
$current_url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$current_url = str_replace("?refresh=$secret_string", '', $current_url); //clean up the URL
Benjamin Adams's avatar
Benjamin Adams committed
26
$current_url = str_replace("&refresh=$secret_string", '', $current_url);
Ulrich Block's avatar
Ulrich Block committed
27
28
29
$redis_key = md5($current_url);

try {
Ulrich Block's avatar
Ulrich Block committed
30
31
32
33
34
35
36
37
38
39
40
41
42
    // check if PECL Extension is available
    if (class_exists('Redis')) {
        $redis = new Redis();
        
        // Sockets can be used as well '/tmp/redis.sock'
        // documentation can be found at https://github.com/nicolasff/phpredis/#connection
        $redis->connect('127.0.0.1');
        
    } else // Fallback to predis5.2.php
    {
        include("wp-content/plugins/wp-redis-cache/predis5.2.php"); //we need this to use Redis inside of PHP
        $redis = new Predis_Client();
    }
Ulrich Block's avatar
Ulrich Block committed
43
} catch (Exception $e) {
Ulrich Block's avatar
Ulrich Block committed
44
    $redisError=true;
Ulrich Block's avatar
Ulrich Block committed
45
}
Benjamin Adams's avatar
Benjamin Adams committed
46
47

//Either manual refresh cache by adding ?refresh=secret_string after the URL or somebody posting a comment
Ulrich Block's avatar
Ulrich Block committed
48
if (!isset($redisError) && (isset($_GET['refresh']) || $_GET['refresh'] == $secret_string || ($_SERVER['HTTP_REFERER'] == $current_url && $_SERVER['REQUEST_URI'] != '/' && $_SERVER['REMOTE_ADDR'] != $ip_of_your_website))) {
49
50
51
52
53
    
    $redis->del($redis_key);
    require('./wp-blog-header.php');
    
    // This page is cached, lets display it
Benjamin Adams's avatar
Benjamin Adams committed
54
} else if ($redis->exists($redis_key)) {
55
56
57
58
    $html_of_page = $redis->get($redis_key);
    echo $html_of_page;
    
    // If the cache does not exist lets display the user the normal page without cache, and then fetch a new cache page
Benjamin Adams's avatar
Benjamin Adams committed
59
} else if ($_SERVER['REMOTE_ADDR'] != $ip_of_your_website && strstr($current_url, 'preview=true') == false) {
60
    
Ulrich Block's avatar
Ulrich Block committed
61
    $isPOST = ($_SERVER['REQUEST_METHOD'] === 'POST') ? 1 : 0;
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
    
    $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();
        echo $html_of_page;
        
        $usr_seconds = get_option('wp-redis-cache-seconds'); //if the user has the seconds defined in the admin section use it
        if (isset($usr_seconds) && is_numeric($usr_seconds)) {
            $seconds_cache_redis = $usr_seconds;
        }
        
        if (strlen($html_of_page) > 5000) {   //prevents caching error pages 
            $redis->setex($redis_key, $seconds_cache_redis, $html_of_page);
        }
    } else //either the user is logged in, or is posting a comment, show them uncached
        {
        require('./wp-blog-header.php');
    }
    
Ulrich Block's avatar
Ulrich Block committed
84
} else if (($_SERVER['REMOTE_ADDR'] != $ip_of_your_website && strstr($current_url, 'preview=true') == true) || isset($redisError)) {
Ulrich Block's avatar
Ulrich Block committed
85
    require('./wp-blog-header.php');
Benjamin Adams's avatar
Benjamin Adams committed
86
}
87
88
89
90
91
 // else {   // This is what your server should get if no cache exists  //depricated, as the ob_start() is cleaner
    // require('./wp-blog-header.php');
// }


Benjamin Adams's avatar
Benjamin Adams committed
92
93

if ($_SERVER['REMOTE_ADDR'] != $ip_of_your_website) {
94
95
96
97
    // How long did it take to load the page? (CloudFlare may strip out comments)
    $end  = microtime();
    $time = (@getMicroTime($end) - @getMicroTime($start));
    echo "<!-- Cache system by Benjamin Adams. Page generated in " . round($time, 5) . " seconds. -->";
Benjamin Adams's avatar
Benjamin Adams committed
98
}