Installing and Using Memcached for PHP on Ubuntu

Memcached is free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load. Start from my article “Memcached Overview” to get an overview of memcached on Linux and Windows.

Install Memcached server

[codesyntax lang=”bash”]
sudo apt-get install memcached
[/codesyntax]
If needed install the following packages:
[codesyntax lang=”bash”]
sudo apt-get install make
sudo apt-get install php5-dev
sudo apt-get install php-pear
sudo apt-get install zlib1g-dev
[/codesyntax]
Restart apache
[codesyntax lang=”bash”]
sudo service apache2 restart
[/codesyntax]

Now memcached is installed.

Run memcached server
[codesyntax lang=”bash”]
memcached -u root -d -m 24 -l 127.0.0.1 -p 11211
[/codesyntax]

Replace 24 with a number of megabytes of cache.

Test memcached with Telnet
[codesyntax lang=”bash”]
telnet 127.0.0.1 11211
[/codesyntax]

and do these tests:

[codesyntax lang=”bash”]
set test2 1 0 2
ab
STORED
set test3 1 0 3
abc
STORED
get test2
VALUE test2 1 2
ab
END
get test3
VALUE test3 1 3
abc
END
set test4 1 0 2
abcde
CLIENT_ERROR bad data chunk
ERROR
[/codesyntax]
Start memcached server automatically after system reboots

Edit the file “/etc/rc.local”:

Add this line
[codesyntax lang=”bash”]
memcached -u www-data -d -m 16 -l 127.0.0.1 -p 11211
[/codesyntax]

before the line
exit 0

Configuring Memcached server:

Edit the file /etc/memcached.conf

 

Restart memcached:
[codesyntax lang=”bash”]
sudo /etc/init.d/memcached restart
[/codesyntax]

PHP Memcached Clients

There are two main PHP libraries which work with a memcached server: php-memcache and php-memcached.

php-memcache vs. php-memcached

php-memcache

The client library php-memcache was developed in 2004 and it is stable and is used in 99.9% of projects based on Memcached server.

The main disadvantage of this library is a lack of functionality. It implements only a part of memcache protocol and doesn’t not allow you to use advanced functions.

php-memcached

The client library php-memcached was developed comparerly early, but it used successfuly in several big projects (for instance, digg.com).

The main advantage of this library is that it fully implements memcache protocol, including:

  • CAS tokens
  • Callbacks
  • Method getDelayed()
  • Supporting of binary protocol
  • Avoid serialization using igbinary

 

performance

In most cases php-memcache libary is faster than php-memcached.

The shown time is the time of performing basic operations of setting/getting/deleting values 10 000 times based on this PHP script:

[codesyntax lang=”php”]

<?php

$ops = 10000;

$m = new Memcache();
$m->addServer('localhost');

$md = new Memcached();
$md->addServer('localhost', 11211);

echo "Test operations: {$ops}";
echo "<h3>get test</h3>";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ ) $m->get( md5(rand(1000, 99999)) );
echo "Memcache: " . ($res['memcache']['set'] = microtime(true) - $s ) . "<br />";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ ) $md->get( md5(rand(1000, 99999)) );
echo "Memcached: " . ($res['memcached']['set'] = microtime(true) - $s );

echo "<h3>set test</h3>";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ ) $m->set(md5(rand(1000, 99999)), 2);
echo "Memcache: " . ($res['memcache']['get'] = microtime(true) - $s ) . "<br />";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ ) $md->set(md5(rand(1000, 99999)), 2);
echo "Memcached: " . ($res['memcached']['get'] = microtime(true) - $s );

echo "<h3>delete test</h3>";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ ) $m->delete(md5(rand(1000, 99999)));
echo "Memcache: " . ($res['memcache']['delete'] = microtime(true) - $s ) . "<br />";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ ) $md->delete(md5(rand(1000, 99999)));
echo "Memcached: " . ($res['memcached']['delete'] = microtime(true) - $s );

echo "<h3>combined test</h3>";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ )
{
	$key = md5(rand(1000, 99999));
	$m->set($key, 2);
	$m->get($key);
	$m->delete($key);
}
echo "Memcache: " . ($res['memcache']['combined'] = microtime(true) - $s ) . "<br />";

$s = microtime(true);
for ( $i = 0; $i < $ops; $i++ )
{
	$key = md5(rand(1000, 99999));
	$md->set($key, 2);
	$md->get($key);
	$md->delete($key);
}
echo "Memcached: " . ($res['memcached']['combined'] = microtime(true) - $s );
?>

[/codesyntax]

The data and code is taken from this article (in russian).

 

Install php5-memcache client

[codesyntax lang=”bash”]
sudo apt-get install php5-memcache
[/codesyntax]

Enable the extension in php.ini (/etc/php5/apache2/php.ini) by adding the line
[codesyntax lang=”bash”]
extension=memcache.so
[/codesyntax]

Restart apache:
[codesyntax lang=”bash”]
sudo service apache2 restart
[/codesyntax]

 

Examples

Basic example of using memcched on PHP

[codesyntax lang=”php”]

<?php
    $memcache = new Memcache; // instantiating memcache extension class
    $memcache->connect("localhost",11211);
// try 127.0.0.1 instead of localhost if it is not working

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

    // we will create an array which will be stored in cache serialized
    $testArray = array('horse', 'cow', 'pig');
    $tmp       = serialize($testArray);

    $memcache->add("key", $tmp, 30);

    echo "Data from the cache:<br />\n";
    print_r(unserialize($memcache->get("key")));
?>

[/codesyntax]

 

 

4 thoughts on “Installing and Using Memcached for PHP on Ubuntu”

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>