Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

memcached persistence in PHP does not work as expected

i have played a bit around with different memcached library and plugin version to enable real persistence between PHP memcache client and memcached server.

The problem is that still connections are opened and closed so that the connection counter goes up instead of the reusage of a existing persistent connection.

I have compiled the memcached daemon on from newest source on a redhat machine. I use the version memcached-1.4.14 and started with "#/opt/memcached/bin/memcached -vvvv"

The php plugin i have also compiled from newest source version memcached-2.0.1, i have compiled it against libmemcached-1.0.9 to have it up to date. Currently it does not compile against libmemcached-1.0.10.

My PHP script looks like this:

<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

$key = "key_" . uniqid();
$memcached = new Memcached( 'persistent' );
$memcached->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$memcached->setOption(Memcached::OPT_RECV_TIMEOUT, 1000);
$memcached->setOption(Memcached::OPT_SEND_TIMEOUT, 3000);
$memcached->setOption(Memcached::OPT_TCP_NODELAY, true);
$memcached->setOption(Memcached::OPT_PREFIX_KEY, 'persistent');

if( !count($memcached->getServerList() ) )
{
    $memcached->addServer( 'localhost', 11211 );
}
$memcached->set($key, 'value');
$value = $memcached->get($key);

print_r( $memcached->getStats() );
?>

On firing the script i see in the output that servers are not added, only after timeout period.

Array ( [@�qVG:11211] => Array ( [pid] => 3728 [uptime] => 73 [threads] => 4 [time] => 1343813688 [pointer_size] => 64 [rusage_user_seconds] => 0 [rusage_user_microseconds] => 6998 [rusage_system_seconds] => 0 [rusage_system_microseconds] => 31995 [curr_items] => 37 [total_items] => 37 [limit_maxbytes] => 67108864 [curr_connections] => 38 [total_connections] => 47 [connection_structures] => 39 [bytes] => 3589 [cmd_get] => 37 [cmd_set] => 37 [get_hits] => 37 [get_misses] => 0 [evictions] => 0 [bytes_read] => 3267 [bytes_written] => 39458 [version] => 1.4.14 ) )

But the connection counter still goes up and i suppose that the client creates a connection and on server side the persistent connection is re-used.

#netstat -an | grep 11211 | wc -l

tcp        0      0 ::1:11211                   ::1:55941                   VERBUNDEN   
tcp        0      0 ::1:55961                   ::1:11211                   VERBUNDEN   
tcp        0      0 ::1:55959                   ::1:11211                   VERBUNDEN   
tcp        0      0 ::1:11211                   ::1:56005                   VERBUNDEN   
...and so on

On server side i get verbous output that tells me that persistence is used:

...
<43 get persistentkey_5018f83903ded
> FOUND KEY persistentkey_5018f83903ded
>43 sending key persistentkey_5018f83903ded
>43 END
...

We want to use memcache on a high performance environment with a lot of incomming connections, and the connection amout does kill the apache childs currently. Any ideas how to enable real persistence?

Used software:

  • Red Hat Enterprise Linux Server release 6.2 (Santiago)
  • PHP Version 5.3.3
  • Apache/2.2.15 in Prefork
  • Memcache server 1.4.14
  • libmemcached 1.0.9
  • PHP memcached plugin 2.0.1
like image 294
Artur Wawrzynkiewicz Avatar asked Aug 01 '12 09:08

Artur Wawrzynkiewicz


People also ask

What does memcached do in PHP?

Memcached is an object caching system. It is primarily used to cache the results of database queries, helping dynamic websites like WordPress® and Drupal to serve pages faster. It can also significantly decrease resource use on a busy web server by reducing calls to the database.

How do I enable Memcached extension?

ini and have in it "extension=memcache.so." So, the steps: First - ./configure with --enable-memcache. This should show in your phpinfo() at the top (even though nothing of the memcache extension works yet).

What is the difference between Memcache and Memcached?

They both have very basic difference while storing value. Memcache mostly considers every value as string whereas Memcached stores it value's original type. Thumbs up for your answer !


1 Answers

That's because you are setting the Memcached::OPT_TCP_NODELAY at every requests. Some options like this one causes the libmemcached library to perform a re-connection at the moment you are setting it.

Since the connection options persist, there is just no reason to set them at every requests. You should therefore use:

<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

$key = "key_" . uniqid();
$memcached = new Memcached( 'persistent' );

if( !count($memcached->getServerList() ) )
{
    $memcached->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
    $memcached->setOption(Memcached::OPT_RECV_TIMEOUT, 1000);
    $memcached->setOption(Memcached::OPT_SEND_TIMEOUT, 3000);
    $memcached->setOption(Memcached::OPT_TCP_NODELAY, true);
    $memcached->setOption(Memcached::OPT_PREFIX_KEY, 'persistent');
    $memcached->addServer( 'localhost', 11211 );
}
$memcached->set($key, 'value');
$value = $memcached->get($key);

print_r( $memcached->getStats() );
?>
like image 131
Patrick Allaert Avatar answered Sep 28 '22 09:09

Patrick Allaert