]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/MemcachePlugin.php
default theme ssl to null
[quix0rs-gnu-social.git] / plugins / MemcachePlugin.php
index acbec135e4ffe07b938631deaccff14c37643948..c5e74fb4162a38efb35a2b37354caf63d32b4287 100644 (file)
@@ -54,6 +54,13 @@ class MemcachePlugin extends Plugin
     private $_conn  = null;
     public $servers = array('127.0.0.1;11211');
 
+    public $compressThreshold = 20480;
+    public $compressMinSaving = 0.2;
+
+    public $persistent = null;
+
+    public $defaultExpiry = 86400; // 24h
+
     /**
      * Initialize the plugin
      *
@@ -64,6 +71,9 @@ class MemcachePlugin extends Plugin
 
     function onInitializePlugin()
     {
+        if (is_null($this->persistent)) {
+            $this->persistent = (php_sapi_name() == 'cli') ? false : true;
+        }
         $this->_ensureConn();
         return true;
     }
@@ -92,7 +102,7 @@ class MemcachePlugin extends Plugin
      *
      * @param string  &$key     in; Key to use for lookups
      * @param mixed   &$value   in; Value to associate
-     * @param integer &$flag    in; Flag (passed through to Memcache)
+     * @param integer &$flag    in; Flag empty or Cache::COMPRESSED
      * @param integer &$expiry  in; Expiry (passed through to Memcache)
      * @param boolean &$success out; Whether the set was successful
      *
@@ -102,7 +112,10 @@ class MemcachePlugin extends Plugin
     function onStartCacheSet(&$key, &$value, &$flag, &$expiry, &$success)
     {
         $this->_ensureConn();
-        $success = $this->_conn->set($key, $value, $flag, $expiry);
+        if ($expiry === null) {
+            $expiry = $this->defaultExpiry;
+        }
+        $success = $this->_conn->set($key, $value, $this->flag(intval($flag)), $expiry);
         Event::handle('EndCacheSet', array($key, $value, $flag,
                                            $expiry));
         return false;
@@ -125,6 +138,23 @@ class MemcachePlugin extends Plugin
         return false;
     }
 
+    function onStartCacheReconnect(&$success)
+    {
+        if (empty($this->_conn)) {
+            // nothing to do
+            return true;
+        }
+        if ($this->persistent) {
+            common_log(LOG_ERR, "Cannot close persistent memcached connection");
+            $success = false;
+        } else {
+            common_log(LOG_INFO, "Closing memcached connection");
+            $success = $this->_conn->close();
+            $this->_conn = null;
+        }
+        return false;
+    }
+
     /**
      * Ensure that a connection exists
      *
@@ -140,23 +170,56 @@ class MemcachePlugin extends Plugin
             $this->_conn = new Memcache();
 
             if (is_array($this->servers)) {
-                foreach ($this->servers as $server) {
-                    list($host, $port) = explode(';', $server);
-                    if (empty($port)) {
-                        $port = 11211;
-                    }
-
-                    $this->_conn->addServer($host, $port);
-                }
+                $servers = $this->servers;
             } else {
-                $this->_conn->addServer($this->servers);
-                list($host, $port) = explode(';', $this->servers);
-                if (empty($port)) {
+                $servers = array($this->servers);
+            }
+            foreach ($servers as $server) {
+                if (strpos($server, ';') !== false) {
+                    list($host, $port) = explode(';', $server);
+                } else {
+                    $host = $server;
                     $port = 11211;
                 }
-                $this->_conn->addServer($host, $port);
+
+                $this->_conn->addServer($host, $port, $this->persistent);
             }
+
+            // Compress items stored in the cache if they're over threshold in size
+            // (default 2KiB) and the compression would save more than min savings
+            // ratio (default 0.2).
+
+            // Allows the cache to store objects larger than 1MB (if they
+            // compress to less than 1MB), and improves cache memory efficiency.
+
+            $this->_conn->setCompressThreshold($this->compressThreshold,
+                                               $this->compressMinSaving);
         }
     }
+
+    /**
+     * Translate general flags to Memcached-specific flags
+     * @param int $flag
+     * @return int
+     */
+    protected function flag($flag)
+    {
+        $out = 0;
+        if ($flag & Cache::COMPRESSED == Cache::COMPRESSED) {
+            $out |= MEMCACHE_COMPRESSED;
+        }
+        return $out;
+    }
+
+    function onPluginVersion(&$versions)
+    {
+        $versions[] = array('name' => 'Memcache',
+                            'version' => STATUSNET_VERSION,
+                            'author' => 'Evan Prodromou, Craig Andrews',
+                            'homepage' => 'http://status.net/wiki/Plugin:Memcache',
+                            'rawdescription' =>
+                            _m('Use <a href="http://memcached.org/">Memcached</a> to cache query results.'));
+        return true;
+    }
 }