]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/MemcachePlugin.php
Merge branch 'master' into testing
[quix0rs-gnu-social.git] / plugins / MemcachePlugin.php
index 2bc4b892bd6a287c9750c73060f7522f68db5bf5..c3ca5c135928e52e9c4d5a897f2b030f227a84f1 100644 (file)
@@ -51,6 +51,8 @@ if (!defined('STATUSNET')) {
 
 class MemcachePlugin extends Plugin
 {
+    static $cacheInitialized = false;
+
     private $_conn  = null;
     public $servers = array('127.0.0.1;11211');
 
@@ -71,10 +73,21 @@ class MemcachePlugin extends Plugin
 
     function onInitializePlugin()
     {
-        if (is_null($this->persistent)) {
+        if (self::$cacheInitialized) {
+            $this->persistent = true;
+        } else {
+            // If we're a parent command-line process we need
+            // to be able to close out the connection after
+            // forking, so disable persistence.
+            //
+            // We'll turn it back on again the second time
+            // through which will either be in a child process,
+            // or a single-process script which is switching
+            // configurations.
             $this->persistent = (php_sapi_name() == 'cli') ? false : true;
         }
         $this->_ensureConn();
+        self::$cacheInitialized = true;
         return true;
     }
 
@@ -102,7 +115,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
      *
@@ -115,12 +128,30 @@ class MemcachePlugin extends Plugin
         if ($expiry === null) {
             $expiry = $this->defaultExpiry;
         }
-        $success = $this->_conn->set($key, $value, $flag, $expiry);
+        $success = $this->_conn->set($key, $value, $this->flag(intval($flag)), $expiry);
         Event::handle('EndCacheSet', array($key, $value, $flag,
                                            $expiry));
         return false;
     }
 
+    /**
+     * Atomically increment an existing numeric key value.
+     * Existing expiration time will not be changed.
+     *
+     * @param string &$key    in; Key to use for lookups
+     * @param int    &$step   in; Amount to increment (default 1)
+     * @param mixed  &$value  out; Incremented value, or false if key not set.
+     *
+     * @return boolean hook success
+     */
+    function onStartCacheIncrement(&$key, &$step, &$value)
+    {
+        $this->_ensureConn();
+        $value = $this->_conn->increment($key, $step);
+        Event::handle('EndCacheIncrement', array($key, $step, $value));
+        return false;
+    }
+
     /**
      * Delete a value associated with a key
      *
@@ -197,6 +228,20 @@ class MemcachePlugin extends Plugin
         }
     }
 
+    /**
+     * 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',