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]
Ashish Mathukiya says:
Good example
Ashish Mathukiya says:
How to store smarty template in memchache??