]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Cache the LDAP schema in memcache (if memcache is available)
authorCraig Andrews <candrews@integralblue.com>
Sat, 19 Dec 2009 20:10:57 +0000 (15:10 -0500)
committerCraig Andrews <candrews@integralblue.com>
Sat, 19 Dec 2009 20:10:57 +0000 (15:10 -0500)
plugins/LdapAuthentication/LdapAuthenticationPlugin.php
plugins/LdapAuthentication/MemcacheSchemaCache.php [new file with mode: 0644]

index 0ce08bd782a1d7951c34c0e772e473a972012d00..39967fe425ed70532c8f6447913980b24dfcf74e 100644 (file)
@@ -67,6 +67,18 @@ class LdapAuthenticationPlugin extends AuthenticationPlugin
             throw new Exception("if password_changeable is set, the password attribute and password_encoding must also be specified");
         }
     }
+
+    function onAutoload($cls)
+    {   
+        switch ($cls)
+        {
+         case 'MemcacheSchemaCache':
+            require_once(INSTALLDIR.'/plugins/LdapAuthentication/MemcacheSchemaCache.php');
+            return false;
+         default:
+            return parent::onAutoload($cls);
+        }
+    }
     
     //---interface implementation---//
 
@@ -175,12 +187,11 @@ class LdapAuthenticationPlugin extends AuthenticationPlugin
         }
         if($config == null) $this->default_ldap=$ldap;
 
-        if (isset($this->schema_cachefile)) {
-            $cacheConfig = array(
-                    'path'    => $this->schema_cachefile,
-                    'max_age' => (isset($this->schema_maxage) ? $this->schema_maxage : 1200 )
-                );
-            $cacheObj = new Net_LDAP2_SimpleFileSchemaCache($cacheConfig);
+        $c = common_memcache();
+        if (!empty($c)) {
+            $cacheObj = new MemcacheSchemaCache(
+                array('c'=>$c,
+                   'cacheKey' => common_cache_key('ldap_schema:' . crc32(serialize($config)))));
             $ldap->registerSchemaCache($cacheObj);
         }
         return $ldap;
diff --git a/plugins/LdapAuthentication/MemcacheSchemaCache.php b/plugins/LdapAuthentication/MemcacheSchemaCache.php
new file mode 100644 (file)
index 0000000..6b91d17
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+/** 
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Cache the LDAP schema in memcache to improve performance
+ *
+ * PHP version 5
+ *
+ * LICENCE: 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  Plugin
+ * @package   StatusNet
+ * @author    Craig Andrews <candrews@integralblue.com>
+ * @copyright 2009 Craig Andrews http://candrews.integralblue.com
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+class MemcacheSchemaCache implements Net_LDAP2_SchemaCache
+{
+    protected $c;
+    protected $cacheKey;
+
+    /**
+    * Initialize the simple cache
+    *
+    * Config is as following:
+    *  memcache     memcache instance
+    *  cachekey  the key in the cache to look at
+    *
+    * @param array $cfg Config array
+    */
+    public function MemcacheSchemaCache($cfg)
+    {
+        $this->c = $cfg['c'];
+        $this->cacheKey = $cfg['cacheKey'];
+    }
+
+    /**
+    * Return the schema object from the cache
+    *
+    * @return Net_LDAP2_Schema|Net_LDAP2_Error|false
+    */
+    public function loadSchema()
+    {
+         return $this->c->get($this->cacheKey);
+    }
+
+    /**
+    * Store a schema object in the cache
+    *
+    * This method will be called, if Net_LDAP2 has fetched a fresh
+    * schema object from LDAP and wants to init or refresh the cache.
+    *
+    * To invalidate the cache and cause Net_LDAP2 to refresh the cache,
+    * you can call this method with null or false as value.
+    * The next call to $ldap->schema() will then refresh the caches object.
+    *
+    * @param mixed $schema The object that should be cached
+    * @return true|Net_LDAP2_Error|false
+    */
+    public function storeSchema($schema) {
+        return $this->c->set($this->cacheKey, $schema);
+    }
+}