From fcbf5cbb0177eee3842c83fed1c837a26a9728eb Mon Sep 17 00:00:00 2001 From: Petr Skoda Date: Tue, 5 Aug 2014 11:34:57 +1200 Subject: [PATCH] MDL-46552 session: add support for multiple servers in memcached session driver --- lib/classes/session/memcached.php | 55 +++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/lib/classes/session/memcached.php b/lib/classes/session/memcached.php index 73bf1bb343c..6efc2b3f1de 100644 --- a/lib/classes/session/memcached.php +++ b/lib/classes/session/memcached.php @@ -137,12 +137,22 @@ class memcached extends handler { return false; } - $memcached = new \Memcached(); - $memcached->addServers($this->servers); - $value = $memcached->get($this->prefix.$sid); - $memcached->quit(); + // Go through the list of all servers because + // we do not know where the session handler put the + // data. - return ($value !== false); + foreach ($this->servers as $server) { + list($host, $port) = $server; + $memcached = new \Memcached(); + $memcached->addServer($host, $port); + $value = $memcached->get($this->prefix . $sid); + $memcached->quit(); + if ($value !== false) { + return true; + } + } + + return false; } /** @@ -155,19 +165,32 @@ class memcached extends handler { return; } - $memcached = new \Memcached(); - $memcached->addServers($this->servers); + // Go through the list of all servers because + // we do not know where the session handler put the + // data. + + $memcacheds = array(); + foreach ($this->servers as $server) { + list($host, $port) = $server; + $memcached = new \Memcached(); + $memcached->addServer($host, $port); + $memcacheds[] = $memcached; + } // Note: this can be significantly improved by fetching keys from memcached, // but we need to make sure we are not deleting somebody else's sessions. $rs = $DB->get_recordset('sessions', array(), 'id DESC', 'id, sid'); foreach ($rs as $record) { - $memcached->delete($this->prefix.$record->sid); + foreach ($memcacheds as $memcached) { + $memcached->delete($this->prefix . $record->sid); + } } $rs->close(); - $memcached->quit(); + foreach ($memcacheds as $memcached) { + $memcached->quit(); + } } /** @@ -179,11 +202,17 @@ class memcached extends handler { return; } - $memcached = new \Memcached(); - $memcached->addServers($this->servers); - $memcached->delete($this->prefix.$sid); + // Go through the list of all servers because + // we do not know where the session handler put the + // data. - $memcached->quit(); + foreach ($this->servers as $server) { + list($host, $port) = $server; + $memcached = new \Memcached(); + $memcached->addServer($host, $port); + $memcached->delete($this->prefix . $sid); + $memcached->quit(); + } } }