The lead developer at Mosaic, Brighton with a passion for web application development and motorcycles.
When working in a team it is very useful to have a central web server with multiple environments and a configuration as close to the live server as possible. This can be a bit of a nightmare though if you need to setup a new VirtualHost container in Apache every time a new project is brought on or when a developer wants to work on a version of the site in their own environment.
The good news is that this can all be handled automatically and new sites can be setup by simply adding a new directory to the file system. There are at least two ways of getting this going; the first of which is the mod_vhost_alias module for Apache and the second is enabled via mod_rewrite. I prefer to use the second method as it is more flexible and it allows you tap into the ability of mod_rewrite to introduce environment variables and redirect requests (this is particularly useful for robots.txt - you’ll see).
The Apache2 Manual does have a very good page dedicated to overcoming this problem, but I will be sharing with you all the settings I am using which you will need to stop Google et. al. from crawling your sites served from the staging environment for example.
Memcached and APC are two tools that you can install on your server and gain almost instant gratification! APC basically caches executions that you send to a PHP process so that the next time you ask the parser to run your script it only has to look for some pre-chewed opcode in memory rather than parsing your PHP from the disk. APC also has another feature up its sleeve, memory object caching, which allows you to store objects such as results from a database table in memory. Memcached works in much the same way, but it can be used as a session handler as well as a persistent store for object data. Another advantage memcached has over APC is that it can be distributed so you could have a number of servers all maintaining memcached daemons to distribute the load.
APC is faster as a straight PHP call on the memory cache, but you can only access the memory cache from the local PHP process. I have not tested it but I am unsure if that means you can access it from CLI PHP as well as via PHP running on Apache. Often I will have a PHP frontend with any server scripts (for example cronjobs) written in Python so it is very handy to be able to access the cache from a central location, which with memcached is possible but not with APC as it is PHP specific. For more information on performance and advice on when various caching methods may be more useful Peter over at MySQLPerformanceBlog has written an interest article Cache Performance Comparison.
So for code that I know will only ever be used by the local PHP process I store the object in the APC memory object store, but if I need portability or the server is under high load and I want to separate out my object cache server from my script server then I use memcached.
I have written two articles detailing the steps involved in installing both the binaries on RedHat Enterprise Linux and Ubuntu or Debian. Currently the live servers I use are either running CentOS or RedHat and the local development server is very nice setup based upon Ubuntu.
The MySQL documentation contains a very nice set of examples and documentation on using memcached to reduce hits on the database, which includes examples in a few languages including Python and PHP. There is also some very handy hints to be gleened from An Introduction to memcached by Jeremy Ashcraft a.k.a MrSpooky over at Search-This.
Installing APC on Debian or Ubuntu is as simple as:
user@server:/directory/$ sudo apt-get install php-apc
Now let us reboot the Apache process to enable our new cache:
user@server:/directory/$ sudo /etc/init.d/apache2 restart
APC should now be ready to run on your server. Try running the following command to verify it is setup; you should get something in response like mine:
user@server:/directory/$ php -r ‘phpinfo();’ | grep ‘apc’
apc
MMAP File Mask => /tmp/apc.s5jA6w
apc.cache_by_default => On => On
apc.coredump_unmap => Off => Off
apc.enable_cli => On => On
apc.enabled => On => On<…SNIP…>
Now lets move onto installing Memcached, which again is very simple:
user@server:/directory/$ sudo apt-get install memcached
user@server:/directory/$ /etc/init.d/memcached start
The PHP Memcached module can be installed through Apt-Get as well:
user@server:/directory/$ sudo apt-get install php5-memcache
Now to configure PHP to use Memcached to store the session information we need to edit our /etc/php5/apache2/php.ini file and find the lines like the following:
session.save_handler = files
;session.save_path =
and change them so that they now look like this:
session.save_handler = memcache
session.save_path = “tcp://localhost:11211?persistent=1&weight=1&timeout=1&retry_interval=15″
That just leaves us to restart the Apache2 process:
user@server:/directory/$ /etc/init.d/apache2 restart
You are now up and running with Memcached PHP sessions and APC served PHP.
Installing APC on Redhat is as simple as:
[user@server directory]# yum install php-pecl-apc
APC should now be ready to run on your server. Try running the following command to verify it is setup; you should get something in response like mine:
[user@server directory]# php -r ‘phpinfo();’ | grep ‘apc’
apc
MMAP File Mask => /tmp/apc.s5jA6w
apc.cache_by_default => On => On
apc.coredump_unmap => Off => Off
apc.enable_cli => On => On
apc.enabled => On => On<…SNIP…>
Now lets move onto installing Memcached, which again is very simple:
[user@server directory]# yum install memcached
[user@server directory]# /etc/init.d/memcached start
The PHP Memcached module can be installed through YUM as well:
[user@server directory]# yum install php-pecl-memcache
Now to configure PHP to use Memcached to store the session information we need to edit our /etc/php.d/memcache.ini file and jump to the bottom of the file where we uncomment the following lines by removing the preceeding semicolon (‘;’):
; Options to use the memcache session handler
; Use memcache as a session handler
;session.save_handler=memcache
; Defines a comma separated of server urls to use for session storage
;session.save_path=”tcp://localhost:11211?persistent=1&weight=1&timeout=1&retry_interval=15″
So that it now looks like this:
; Options to use the memcache session handler
; Use memcache as a session handler
session.save_handler=memcache
; Defines a comma separated of server urls to use for session storage
session.save_path=”tcp://localhost:11211?persistent=1&weight=1&timeout=1&retry_interval=15″
That just leaves us to restart the Apache/HTTPd process:
[user@server directory]# /etc/init.d/httpd restart
You are now up and running with Memcached PHP sessions and APC served PHP.