]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
First version of Memcache plugin
authorEvan Prodromou <evan@status.net>
Sun, 3 Jan 2010 07:16:59 +0000 (21:16 -1000)
committerEvan Prodromou <evan@status.net>
Sun, 3 Jan 2010 07:16:59 +0000 (21:16 -1000)
lib/cache.php
lib/common.php
lib/default.php
plugins/MemcachePlugin.php [new file with mode: 0644]

index 63f582861984f8cf5380b4b0948fef679a3facbb..23657bbf348ec436d26b372432f72ce61dab1246 100644 (file)
@@ -78,7 +78,7 @@ class Cache
 
     static function key($extra)
     {
-        $base_key = common_config('memcached', 'base');
+        $base_key = common_config('cache', 'base');
 
         if (empty($base_key)) {
             $base_key = common_keyize(common_config('site', 'name'));
index 7fa1910af86cd78870c2847fdf2479019f837f1c..b0e5c4390a9595b3cd67e02b101906c6461d20d5 100644 (file)
@@ -210,6 +210,18 @@ if ($_db_name != 'statusnet' && !array_key_exists('ini_'.$_db_name, $config['db'
     $config['db']['ini_'.$_db_name] = INSTALLDIR.'/classes/statusnet.ini';
 }
 
+// Backwards compatibility
+
+if (array_key_exists('memcached', $config)) {
+    if ($config['memcached']['enabled']) {
+        addPlugin('Memcache', array('servers' => $config['memcached']['server']));
+    }
+
+    if (!empty($config['memcached']['base'])) {
+        $config['cache']['base'] = $config['memcached']['base'];
+    }
+}
+
 function __autoload($cls)
 {
     if (file_exists(INSTALLDIR.'/classes/' . $cls . '.php')) {
index 8a70ed3fa15d0672899f0d4c22e68abf062b7349..eea11eb2b1c6561f6a125fa11dd3fa65cf145542 100644 (file)
@@ -147,11 +147,8 @@ $default =
         array('enabled'       => true,
               'consumer_key'    => null,
               'consumer_secret' => null),
-        'memcached' =>
-        array('enabled' => false,
-              'server' => 'localhost',
-              'base' => null,
-              'port' => 11211),
+        'cache' =>
+        array('base' => null),
         'ping' =>
         array('notify' => array()),
         'inboxes' =>
diff --git a/plugins/MemcachePlugin.php b/plugins/MemcachePlugin.php
new file mode 100644 (file)
index 0000000..acbec13
--- /dev/null
@@ -0,0 +1,162 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2009, StatusNet, Inc.
+ *
+ * Plugin to implement cache interface for memcache
+ *
+ * PHP version 5
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  Cache
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2009 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    // This check helps protect against security problems;
+    // your code file can't be executed directly from the web.
+    exit(1);
+}
+
+/**
+ * A plugin to use memcache for the cache interface
+ *
+ * This used to be encoded as config-variable options in the core code;
+ * it's now broken out to a separate plugin. The same interface can be
+ * implemented by other plugins.
+ *
+ * @category  Cache
+ * @package   StatusNet
+ * @author    Evan Prodromou <evan@status.net>
+ * @copyright 2009 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+
+class MemcachePlugin extends Plugin
+{
+    private $_conn  = null;
+    public $servers = array('127.0.0.1;11211');
+
+    /**
+     * Initialize the plugin
+     *
+     * Note that onStartCacheGet() may have been called before this!
+     *
+     * @return boolean flag value
+     */
+
+    function onInitializePlugin()
+    {
+        $this->_ensureConn();
+        return true;
+    }
+
+    /**
+     * Get a value associated with a key
+     *
+     * The value should have been set previously.
+     *
+     * @param string &$key   in; Lookup key
+     * @param mixed  &$value out; value associated with key
+     *
+     * @return boolean hook success
+     */
+
+    function onStartCacheGet(&$key, &$value)
+    {
+        $this->_ensureConn();
+        $value = $this->_conn->get($key);
+        Event::handle('EndCacheGet', array($key, &$value));
+        return false;
+    }
+
+    /**
+     * Associate a value with a key
+     *
+     * @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 &$expiry  in; Expiry (passed through to Memcache)
+     * @param boolean &$success out; Whether the set was successful
+     *
+     * @return boolean hook success
+     */
+
+    function onStartCacheSet(&$key, &$value, &$flag, &$expiry, &$success)
+    {
+        $this->_ensureConn();
+        $success = $this->_conn->set($key, $value, $flag, $expiry);
+        Event::handle('EndCacheSet', array($key, $value, $flag,
+                                           $expiry));
+        return false;
+    }
+
+    /**
+     * Delete a value associated with a key
+     *
+     * @param string  &$key     in; Key to lookup
+     * @param boolean &$success out; whether it worked
+     *
+     * @return boolean hook success
+     */
+
+    function onStartCacheDelete(&$key, &$success)
+    {
+        $this->_ensureConn();
+        $success = $this->_conn->delete($key);
+        Event::handle('EndCacheDelete', array($key));
+        return false;
+    }
+
+    /**
+     * Ensure that a connection exists
+     *
+     * Checks the instance $_conn variable and connects
+     * if it is empty.
+     *
+     * @return void
+     */
+
+    private function _ensureConn()
+    {
+        if (empty($this->_conn)) {
+            $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);
+                }
+            } else {
+                $this->_conn->addServer($this->servers);
+                list($host, $port) = explode(';', $this->servers);
+                if (empty($port)) {
+                    $port = 11211;
+                }
+                $this->_conn->addServer($host, $port);
+            }
+        }
+    }
+}
+