summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Andrews <candrews@integralblue.com>2009-12-19 15:10:57 -0500
committerCraig Andrews <candrews@integralblue.com>2009-12-19 15:10:57 -0500
commita43c310fbcbe91fe849a2e14fdabd9824be7dbfe (patch)
tree5ce9d9d7d63d4398f0feacfcf1b3f476524bd0a1
parent4002c18065eb324e983a1ecb997af9d2f9b18dde (diff)
Cache the LDAP schema in memcache (if memcache is available)
-rw-r--r--plugins/LdapAuthentication/LdapAuthenticationPlugin.php23
-rw-r--r--plugins/LdapAuthentication/MemcacheSchemaCache.php75
2 files changed, 92 insertions, 6 deletions
diff --git a/plugins/LdapAuthentication/LdapAuthenticationPlugin.php b/plugins/LdapAuthentication/LdapAuthenticationPlugin.php
index 0ce08bd78..39967fe42 100644
--- a/plugins/LdapAuthentication/LdapAuthenticationPlugin.php
+++ b/plugins/LdapAuthentication/LdapAuthenticationPlugin.php
@@ -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
index 000000000..6b91d17d6
--- /dev/null
+++ b/plugins/LdapAuthentication/MemcacheSchemaCache.php
@@ -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);
+ }
+}