diff --git a/dmemcache.inc b/dmemcache.inc index 40e9db6..e13d54d 100644 --- a/dmemcache.inc +++ b/dmemcache.inc @@ -277,7 +277,7 @@ function dmemcache_stats($stats_bin = 'cache', $stats_type = 'default', $aggrega * @return an Memcache object or FALSE. */ function dmemcache_object($bin = NULL, $flush = FALSE) { - static $extension, $memcacheCache = array(), $memcache_servers, $memcache_bins, $memcache_persistent, $failed_connection_cache; + static $extension, $memcacheCache = array(), $memcache_servers, $memcache_bins, $memcache_persistent, $failed_connection_cache, $connection_pool = array(); if (!isset($extension)) { // If an extension is specified in settings.php, use that when available. @@ -335,7 +335,8 @@ function dmemcache_object($bin = NULL, $flush = FALSE) { else { // Create a new Memcache object. Each cluster gets its own Memcache object. if ($extension == 'Memcached') { - $memcache = new Memcached; + $memcache = new Memcached($memcache_persistent ? 'memcache.module' : ''); + $default_opts = array( Memcached::OPT_COMPRESSION => FALSE, Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT, @@ -349,6 +350,12 @@ function dmemcache_object($bin = NULL, $flush = FALSE) { foreach ($memconf as $key => $value) { $memcache->setOption($key, $value); } + // Retrieve a list of existing persistent connections. + if ($memcache_persistent && !isset($connection_pool)) { + foreach ($memcache->getServerList() as $s) { + $connection_pool["{$s['host']}:{$s['port']}"] = TRUE; + } + } } elseif ($extension == 'Memcache') { $memcache = new Memcache; @@ -405,7 +412,9 @@ function dmemcache_object($bin = NULL, $flush = FALSE) { // Port is always 0 for unix sockets. $port = 0; } - if ($memcache->addServer($host, $port) && !$init) { + if ((($memcache_persistent && isset($connection_pool["$host:$port"])) || + ($memcache->addServer($host, $port) && ($connection_pool["$host:$port"] = TRUE))) && + !$init) { $init = TRUE; } }