After moving hosts for some reason my WP-Cache2 plugin stopped caching pages and I couldn’t work out why, so I’ve spent the last couple of hours looking for alternatives as I wanted to make sure I don’t get into trouble again with my new host, even though I have a VPS now rather than a shared host. I’ve managed to implement some good actions this morning which have significantly improved the page loading times of my WordPress blog. I’m sharing what I’ve done below which will definitely help other WordPress users and other users who have to manage a server, get faster loading times as well as reducing server strain. Much needed, particularly if you make it onto Digg’s homepage!
Install APC Part I
The first action I implemented was installing Alternative PHP Cache or APC. APC speeds up loading times by caching compiled WordPress PHP files so that the loading time the next time a page is loaded is much faster. This is different to WP-Cache2, which stores the HTML of a page for a user-defined period, which can cause problems if new comments or posts are made within this period i.e. if the page changes. APC doesn’t suffer from this problem and all page loads are dynamic.
APC and WP-Cache2 currently can’t be installed at the same time, although Mark Jaquith is working on trying to get the best of both worlds by finding a way to get APC and WP-Cache2 to work together, and I’m pretty sure he will crack it soon. However, given that I can’t even get WP-Cache2 to work by itself I didn’t even attempt to try some of Mark’s experiments. Initially I struggled to install APC as until two weeks ago when I moved from Blogware to WordPress I’d never even used MySQL before, much less configured a server. Luckily I found these instructions by Matthew Carroll on how to install APC which I almost managed to complete by myself, but Matthew was kind enough to finish the job for me.
Install APC Part II
Although my pages were loading faster after installing APC, Matthew and I were a bit disappointed by the speed as we were expecting more of a speed boost. I did a bit more digging around on the net and I found an old post by Mark Jaquith on WP-Hackers. Mark had been as enterprising as ever and had posted a custom script that uses APC as the object cache backend instead of WP’s default of caching objects to the disk. Once I installed this script my WordPress installation started to take full advantage of the APC installation and my pages literally started to fly, despite my 40-50 plugins. To install the script just rename it to object-cache.php and install it in wp-content/object-cache.php
Turn On MySQL Query Cache
MySQL 4 includes a query cache which helps if the database is running the same query over and over again on the same data set i.e. a page hasn’t changed; it is just being viewed over and over again. If the query cache is turned on MySQL can cache the result set, avoiding the overhead of repeatedly running the query. If you are on a shared server and you are public enemy number 1 for hogging database resources then this little beauty could be for you. Most decent hosts will probably have the MySQL qcache turned on by default, but it’s worth checking it just to be sure.
Despite getting a significant speed increase from installing APC and also turning on MySQL’s query cache, I still wasn’t satisfied and I wanted more speed. The next optimisation step I found again came from Mark Jacquith in the form of the Post-Query Accelerator, which ensures that WordPress gets the most out of MySQL’s Query Cache. Here’s how it works in Mark’s own words:
WordPress’ post queries always ask for posts with post_date_gmt <= ‘$now’ where $now is set to the current time, to prevent posts in the future from showing up. This means that $now changes with each page load. For high volume MySQL sites, the system administrator might turn on MySQL’s qcache, in order to cache some SQL queries. The problem with $now is that it changes each time, so the query is never exactly the same again, and the cache doesn’t help. This plugin is designed to freeze $now to reflect the time of the most recent post or page. This does the job of preventing future posts from showing up, but doesn’t needlessly change $now on every load. This can lead to rather large query speedups on high volume sites or sites with many posts. If things like qcache and my.cnf are Greek to you, please don’t use this plugin. Those who need this plugin will know that they need it, and without a properly configured my.cnf with query caching, it will do nothing.
Installing the plugin couldn’t be easier. Just download and save the file named post-query-accelerator.php. Upload it to your /wp-content/plugins/ directory and activate it