memcached-logo
Memcached is a distributed memory caching system. It caches data and objects in RAM in order to reduce the frequency of access to database or to an external API. Consequently, it helps to speed up dynamic websites.

The first release of memcached was in 2003.

Why?

To protect user data, sessions are stored in files on the servers themselves. This has several disadvantages:

  • The user must be sticked to a front to maintain it’s session
  • It generates a a lot of disk IO on servers

Using Memcached to store sessions:

  • Removes the disk IO related sessions
  • Allows not to stick a user to a server (and to complete round robin on a server pool)

Install & Tests

We need Apache running. Let’s say Apache is listening on 192.168.1.10

edit /var/www/php-info.php like below:

<?php
php phpinfo() ;
?>

The 2 packages that we need are :

  • Memcached
  • PHP5 memcache module

We can install them as follows:

apt-get install memcached php5-memcache

After the installation, memcached should already be running. You can check that by typing

server1:~# netstat -tap | grep memcached
tcp        0      0 *:11211                 *:*                     LISTEN     3053/memcached

By default, memcached is using port 11211 and is listening on all interfaces. So, to avoid that anyone (as memcached has no build-in authentication mechanisms) can connect to it and use it we have two solutions:

  1. Close port 11211 in your firewall.
  2. Configure memcached to listen only on localhost.

Here, I’ll use the second method.

Following are the steps:

  1. Edit /etc/memcached.conf 
  2. Modify the list of the IP addresses to listen on (from all IP addresses to localhost address) by adding: -l 127.0.0.1 to the configuration.

You can also do (optional steps):

  1. Adjust the other settings in the memcached configuration (the file contains explanations for each setting).
  2. Make sure that memcached is listening on a firewalled interface (this is one of the only security measures taken by memcached).

Rerun netstat after restarting memcached:

/etc/init.d/memcached restart
netstat -tap | grep memcached

Memcached is now only listening on localhost:

server1:~# netstat -tap | grep memcached
tcp       0         0     localhost.localdo:11211         *:*           LISTEN    3092/memcached

Client session

We can use our script /var/www/php-info.php to know which php.ini is loaded

Edit the used php.ini and search for the ‘[Session]’ area as displayed below

[Session]
; Handler used to store/retrieve data.
; http://www.php.net/manual/en/session.configuration.php#ini.session.save-handler
session.save_handler = files

And change it to this:

[Session]
; Handler used to store/retrieve data.
; http://www.php.net/manual/en/session.configuration.php#ini.session.save-handler
session.save_handler = memcached
session.save_path = "127.0.0.1:11211" 

Now, we have finished with the required changes and the session_handler is using memcached.

For multiple memcached servers listening on IP1, IP2 and IP3 :

[Session]
; Handler used to store/retrieve data.
; http://www.php.net/manual/en/session.configuration.php#ini.session.save-handler
session.save_handler = memcached
session.save_path = "tcp://IP1:11211, tcp://IP2:11211, tcp://IP3:11211"

Restarting Apache is mandatory in order that the new PHP configuration takes effect:

/etc/init.d/apache2 restart

Now, open php-info.php again in a browser: http://192.168.0.10/php-info.php

Search for memcache ans you should see it mentioned on the page. It is working as expected.

Simple application with memcached

Let’s use a simple PHP code to use memcached. Edit a new file /var/www/memcached.php


<?php
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect to memcache instance");

$version = $memcache->getVersion();
echo "Server's version: ".$version."<br/>\n";

$tmp_object1 = new stdClass;
$tmp_object1->str_attr = 'test';
$tmp_object1->int_attr = 111;

$tmp_object2 = new stdClass;
$tmp_object2->str_attr = time();
$tmp_object2->int_attr = 222;

$tmp_object3 = new stdClass;
$tmp_object3->str_attr = 'never_expires';
$tmp_object3->int_attr = 333;

echo "Store data (key1) in the cache (data will expire in 60 seconds)<br/>\n";
$memcache->set('key1', $tmp_object1, false, 60) or die ("Failed to save data at the server");

echo "Store data (key2) in the cache (data will expire in 7200 seconds)<br/>\n";
$memcache->set('key2', $tmp_object2, false, 7200) or die ("Failed to save data at the server");

echo "Store data (key3) in the cache (data will never expire)<br/>\n";
$memcache->set('key3', $tmp_object3, false, 0) or die ("Failed to save data at the server");

$get_result = $memcache->get('key1');

echo "Data from the cache: key1 : <br/>\n";
var_dump($get_result);

$get_result = $memcache->get('key2');

echo "<br/>Data from the cache: key2 : <br/>\n";
var_dump($get_result);

$get_result = $memcache->get('key3');

echo "<br/>Data from the cache: key3 : <br/>\n";
var_dump($get_result);

?>

Call the php file in the browser and if all worked well we see :

memcached-test

What is next?

We will see in part II how to use memcached in command line.

The following two tabs change content below.
I am a hands-on, competent Linux system engineer with 5 years’ experience. I have a strong performance background in wide variety of professional Linux system support including monitoring, configuration, troubleshooting and maintenance. I have worked on numerous projects from concept to completion. A specialist in LAMP platforms, I take pride in administrating Linux systems and regularly refresh my skills to ensure I keep up with ongoing developments and new technologies.