Version 1
[yaffs-website] / web / modules / contrib / memcache / src / DrupalMemcached.php
diff --git a/web/modules/contrib/memcache/src/DrupalMemcached.php b/web/modules/contrib/memcache/src/DrupalMemcached.php
new file mode 100644 (file)
index 0000000..34d4ac0
--- /dev/null
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\memcache\DrupalMemcached.
+ */
+
+namespace Drupal\memcache;
+
+/**
+ * Class DrupalMemcached.
+ */
+class DrupalMemcached extends DrupalMemcacheBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(DrupalMemcacheConfig $settings) {
+    parent::__construct($settings);
+
+    $this->memcache = new \Memcached();
+
+    $default_opts = array(
+      \Memcached::OPT_COMPRESSION => FALSE,
+      \Memcached::OPT_DISTRIBUTION => \Memcached::DISTRIBUTION_CONSISTENT,
+    );
+    foreach ($default_opts as $key => $value) {
+      $this->memcache->setOption($key, $value);
+    }
+    // See README.txt for setting custom Memcache options when using the
+    // memcached PECL extension.
+    foreach ($this->settings->get('options', []) as $key => $value) {
+      $this->memcache->setOption($key, $value);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function addServer($server_path, $persistent = FALSE) {
+    list($host, $port) = explode(':', $server_path);
+
+    if ($host == 'unix') {
+      // Memcached expects just the path to the socket without the protocol
+      $host = substr($host, 7);
+      // Port is always 0 for unix sockets.
+      $port = 0;
+    }
+
+    return $this->memcache->addServer($host, $port, $persistent);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function close() {
+    $this->memcache->quit();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function set($key, $value, $exp = 0, $flag = FALSE) {
+    $full_key = $this->key($key);
+    return $this->memcache->set($full_key, $value, $exp);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getMulti(array $keys) {
+    $full_keys = array();
+
+    foreach ($keys as $cid) {
+      $full_key = $this->key($cid);
+      $full_keys[$cid] = $full_key;
+    }
+
+    $cas_tokens = NULL;
+    $results = $this->memcache->getMulti($full_keys, $cas_tokens, \Memcached::GET_PRESERVE_ORDER);
+
+    // If $results is FALSE, convert it to an empty array.
+    if (!$results) {
+      $results = array();
+    }
+
+    // Convert the full keys back to the cid.
+    $cid_results = array();
+    $cid_lookup = array_flip($full_keys);
+
+    foreach (array_filter($results) as $key => $value) {
+      $cid_results[$cid_lookup[$key]] = $value;
+    }
+
+    return $cid_results;
+  }
+
+}