Hacking WP Super Cache for Speed
« Speed Up Google Analytics, use local ga.jsPreload flash .flv files into browser cache »
So I couldn’t help it, I downloaded and installed WP Super Cache because it sounded like an ideal setup for me.. A plugin built to generate static files from php+mysql for Apache to serve the way its supposed to be.. My dream.
So I started digging into the code. Its a form of WP Cache-2, but fork is a generous word at this point. There is some future add-on capability, but the code that actually performs the caching is pretty much the same. Bloated, inefficient, and redundant coding. This plugin could do the same thing with 1 file, no config, no meta, serializing, etc.. But its still a lot better than anything I’ve created.
I’m very interested in this technology and this is the closest to my ideal that a WordPress plugin has come so far, I might just start from scratch one of these days, once I figure out a few php bits I’m still learning about. If I do decide to make a caching plugin the right way, it will have similar tricks that I used in the Hack WP-Cache for maximum speed post.
The .htaccess generated by WP Super Cache is wack, I’m not even sure how its been working for everyone, I’ve hacked it up a bit and this is working great for me.. Will definately be updated as I do more debugging.
I used some of the same techniques found here, and here, and these SetEnvIf examples.
# BEGIN WordPress
SetEnv HTTP_IF_GZ_MATCH .html
SetEnvIfNoCase ^Accept-Encoding$ "(.*gzip.*)" HTTP_IF_GZ_MATCH=.html.gz
RewriteCond %{ENV:REDIRECT_STATUS} !=200
RewriteCond %{QUERY_STRING} !s
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.+)\ HTTP/ [NC]
RewriteCond %{HTTP_COOKIE} !^.*(comment_author_|wordpress|wp-postpass_).*$
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/%1/index%{ENV:HTTP_IF_GZ_MATCH} -f
RewriteRule ^(.*)$ /wp-content/cache/supercache/$1/index%{ENV:HTTP_IF_GZ_MATCH} [L,NC]
# END WordPress
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} !.*s=.*
RewriteCond %{HTTP_COOKIE} !^.*comment_author_.*$
RewriteCond %{HTTP_COOKIE} !^.*wordpress.*$
RewriteCond %{HTTP_COOKIE} !^.*wp-postpass_.*$
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz -f
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html.gz [L]
RewriteCond %{QUERY_STRING} !.*s=.*
RewriteCond %{HTTP_COOKIE} !^.*comment_author_.*$
RewriteCond %{HTTP_COOKIE} !^.*wordpress.*$
RewriteCond %{HTTP_COOKIE} !^.*wp-postpass_.*$
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html -f
RewriteRule ^(.*) /wp-content/cache/supercache/%{HTTP_HOST}/$1/index.html [L]
# END WordPress
It’s definately a complex kind of plugin in that there is a lot of directions and a lot going on, so I’m not saying anything bad about the developers, just hope to see some updates over the next few months so I don’t have to mess with it.
« Speed Up Google Analytics, use local ga.js
Preload flash .flv files into browser cache »
Please consider donating to support active development of the free software and articles here.![]()
The power of the Web is in its universality. Access by everyone regardless of disability is an essential aspect. Tim Berners-Lee
Data caching provides the most granular control of cached data. The data cache is a full-featured cache engine that enables you to store and retrieve data between multiple HTTP requests and multiple sessions within the same application. There are three different methods that you can use to add data or objects to the cache.
When using the code with AudioPlayer 2.0b plugin the audio doesn’t play in Firefox and in IE it is compressing the audio and putting noise in it. What needs to be changed to work with audio player?
Overall it works great and load the site extremely fast.
you got a due date on that inhouse plugin release? or will it remain in house?
I ended up just making my own caching plugin which is still in house.. Its pretty cool for pimping this server out. Right now I’m serving up both text/html application/xhtml+xml… Both of which are available in gzip as well and both of which validate as strict as it goes.
I’ve been playing around with other forms of media that I can also incorporate.. I’ve already added custom rdf files for every page using the same caching system which I might release when I finish with this password protection upgrade.
Its based on my lightning cache plugin.
—
Here’s some of the code I’m at today if it helps..
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD) [OR]
RewriteCond %{QUERY_STRING} !^$ [OR]
RewriteCond %{HTTP_COOKIE} ^.*(comment_author_|wordpress|wp-postpass_).*$ [NC]
RewriteRule ^(.*)$ – [S=6]
RewriteCond %{HTTP_USER_AGENT} .*W3C_Validator.* [NC]
RewriteCond %{HTTP:Accept-Encoding} gzip [NC]
RewriteCond %{DOCUMENT_ROOT}/fast-cache/$1/index.xhtml.gz -f
RewriteRule ^(.*)$ /fast-cache/$1/index.xhtml.gz [L,S=5]
RewriteCond %{HTTP:Accept} application/xhtml\+xml [NC]
RewriteCond %{HTTP:Accept-Encoding} gzip [NC]
RewriteCond %{DOCUMENT_ROOT}/fast-cache/$1/index.xhtml.gz -f
RewriteRule ^(.*)$ /fast-cache/$1/index.xhtml.gz [L,S=4]
RewriteCond %{HTTP:Accept-Encoding} gzip [NC]
RewriteCond %{DOCUMENT_ROOT}/fast-cache/$1/index.html.gz -f
RewriteRule ^(.*)$ /fast-cache/$1/index.html.gz [L,S=3]
RewriteCond %{HTTP_USER_AGENT} .*W3C_Validator.* [NC]
RewriteCond %{DOCUMENT_ROOT}/fast-cache/$1/index.xhtml -f
RewriteRule ^(.*)$ /fast-cache/$1/index.xhtml [L,S=2]
RewriteCond %{HTTP:Accept} application/xhtml\+xml [NC]
RewriteCond %{DOCUMENT_ROOT}/fast-cache/$1/index.xhtml -f
RewriteRule ^(.*)$ /fast-cache/$1/index.xhtml [L,S=1]
RewriteCond %{DOCUMENT_ROOT}/fast-cache/$1/index.html -f
RewriteRule ^(.*)$ /fast-cache/$1/index.html [L]
FileETag None
AddEncoding x-gzip .gz
AddType ‘application/xhtml+xml; charset=UTF-8′ .xhtml
AddType ‘text/html; charset=UTF-8′ .html
Header set P3P “policyref=\”http://www.askapache.com/w3c/p3p.xml\”"
Header set Content-Language “en-US”
# BEGIN AskApache Crazy Cache
FileETag All
AddEncoding x-gzip .gz
AddType ‘application/xhtml+xml; charset=UTF-8′ .xhtml
AddType ‘application/xhtml+xml; charset=UTF-8′ .xhtml.gz
AddType ‘text/html; charset=UTF-8′ .html
AddType ‘text/html; charset=UTF-8′ .html.gz
Header set P3P “policyref=\”http://www.askapache.com/w3c/p3p.xml\”"
Header set X-Pingback “http://www.askapache.com/xmlrpc.php”
Header set Content-Language “en-US”
Header set Vary “Accept-Encoding,Accept”
ExpiresActive On
ExpiresDefault A3600
# END AskApache Crazy Cache
While I agree that the rules aren’t entirely optimal, there’s a problem with your ruleset.
“RewriteCond %{HTTP:Accept-Encoding} gzip” in the original causes a Vary: Accept-Encoding header to be appended if the rule passes as true.
Without that header, a front-end or intermediate cache could, for example, send cached gzipped content to a UA that doesn’t support it.
I agree with the other comment, I’ve just been looking for a date and I’m not sure if this article is still valid.
offtopic: his name is stuart aswell, what are the odds?
Hi, do you think you could put the date somewhere on the post. It’s a little annoying landing here from google and not knowing if what I’m reading is fresh or outdated, especially when it says stuff like this article says.
To find the date of this particular page I had to go to your homepage, look down the sidebar, click on the ‘Cache’ tag, and find the excerpt among the index listings. Not high usability by any means :(
It's very simple - you read the protocol and write the code. -Bill Joy
HTML | DCMI | GRDDL | XOXO | XDMP | XFN | DOM | XML | XHTML 1.1 Strict | CSS 2.1 | W3C | TLDP | WAI | DISA | ICSI | GIAC | SANS RR | GHOST | DEFCON | NIST | DHS CYBER | NIST
↑ TOPExcept where otherwise noted, content on this site is licensed under a Creative Commons Attribution 3.0 License, just credit with a link.
This site is not supported or endorsed by The Apache Software Foundation (ASF). All software and documentation produced by The ASF is licensed. "Apache" is a trademark of The ASF. HTTPD based on NCSA HTTPd
1 question – how does one ask apache to log performance metrics of an .htaccess file?