Merge branch 'wip_MDL-46552_m28_memcached' of https://github.com/skodak/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 19 Aug 2014 00:28:56 +0000 (02:28 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 19 Aug 2014 00:28:56 +0000 (02:28 +0200)
1  2 
lib/classes/session/memcached.php

@@@ -125,9 -125,9 +125,9 @@@ class memcached extends handler 
      }
  
      /**
 -     * Check for existing session with id $sid.
 +     * Check the backend contains data for this session id.
       *
 -     * Note: this verifies the storage backend only, not the actual session records.
 +     * Note: this is intended to be called from manager::session_exists() only.
       *
       * @param string $sid
       * @return bool true if session found.
              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.
+         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 ($value !== false);
+         return false;
      }
  
      /**
              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();
+         }
      }
  
      /**
              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();
+         }
      }
  
  }