Guide To Optimizing WordPress Servers
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.
Post-Query Accelerator
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
Related Posts
- I Need Wordpress MySQL Help, And I’m Willing To Pay
- Ultimate Wordpress Site Speed - Install WP-Cache2 AND APC At The Same Time
- Optimise Your CSS File
- Wordpress Plugins NOT To Install
- How To Fix WP-Cache And Spam Karma 2 (SK2) Issues
- WordPress Optimisation: Control When Plugins Are Loaded
Continue Reading This Post:12




Comment by Webdesigner on 5 February 2008:
Useful roundup! I added it to my bookmarks. Thanks!
Comment by Stereophonics on 27 November 2007:
over 250 tickets in the trac system doesn’t seem right
Comment by Ginn Wei on 21 October 2007:
Thanks for the information. It will definitely come in handy if I’m getting a VPS for my blog. Nowadays, everything needs to be fast.
Comment by wordpress quickstart guy on 14 August 2007:
very detailed explaination on the server installation!
great post.
Comment by John Black on 1 August 2007:
Wp-Cache plugin the only thing you need : ) decreases the load from 50 to 0.4 : )
Pingback by Bookmarks for Wednesday, June 20th — Trevor Fitzgerald on 21 June 2007:
[...] Guide To Optimizing WordPress Servers | Connected Internet - [...]
Comment by Everton on 19 June 2007:
Here’s my.cnf file. PLease don’t ask me any questions about the settings - beyond my ability to answer!
[mysqld]safe-show-database
old-passwords = 1
skip-locking
character-sets-dir=/usr/share/mysql/charsets/
query_cache_limit=3M
query_cache_size=48M
query_cache_type=1
max_user_connections=300
set-variable = max_connections=500
interactive_timeout=30
wait_timeout=20
connect_timeout=5
thread_cache_size=1024
thread_concurrency=2
key_buffer=24M
join_buffer=3M
max_allowed_packet=32M
table_cache=3096
record_buffer=3M
sort_buffer_size=3096K
read_buffer_size=3096K
max_connect_errors=10
read_rnd_buffer_size=3096K
myisam_sort_buffer_size=48M
socket=/var/lib/mysql/mysql.sock
[mysql.server]
user=mysql
basedir=/var/lib
[safe_mysqld]
open_files_limit=7092
[mysqldump]
quick
max_allowed_packet=64M
max_allowed_packet=64M
[mysql]
no-auto-rehash
[isamchk]
key_buffer=48M
sort_buffer=48M
read_buffer=24
write_buffer=24M
[myisamchk]
key_buffer=48M
sort_buffer=48M
read_buffer=24M
write_buffer=24M
[mysqlhotcopy]
interactive-timeout
Comment by Dan and Jennifer on 18 June 2007:
Hey Everton,
Awesome post!
Would you mind sharing with us your my.cnf file? I’m making some performance enhancements to our new virtual (VPS) server (with HostDime.com - I’m really liking the setup).
We’ve got mod_php and PHP eAccelerator (PHP object caching) running already so caching PHP files, so MySQL performance is the next step.
I’m now running with the default Mysql config file, and was going to turn on query cache, but would like to see what you’re doing overall. BTW, we’re running with a TOTAL 512MB in our VPS (virtual server)…
Oh, regarding Post Query Accelerator - did you have any problems with it impacting your Wordpress admin functions (i.e. draft posts not showing up?). I figure not, but just checking.
Thanks!
Have an awesome day!
Dan
Trackback by Advanced Internet Marketing & Affiliate Marketing Blog on 24 March 2007:
Diggproof & Speed up Your Wordpress Blog…
With more & more blogs getting exposure on social news sites it’s not uncommon that you’ve experienced the wrath of the “Digg Effect” or been Slashdotted. It’s not fun, especially if you’ve got other sites hosted…