You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by li...@apache.org on 2008/03/12 21:13:59 UTC

svn commit: r636489 - in /incubator/shindig/trunk/php/gadgets: config.php src/CacheFile.php src/CacheMemcache.php src/FileCache.php

Author: lindner
Date: Wed Mar 12 13:13:54 2008
New Revision: 636489

URL: http://svn.apache.org/viewvc?rev=636489&view=rev
Log:
Patch from Chris Chabot for SHINDIG-123

This patch adds a memcached backend, which is a bit slower in single server situations, but works very well with multi server setups.
Also renames FileCache.php to CacheFile.php for consitency.

Added:
    incubator/shindig/trunk/php/gadgets/src/CacheFile.php
      - copied, changed from r636486, incubator/shindig/trunk/php/gadgets/src/FileCache.php
    incubator/shindig/trunk/php/gadgets/src/CacheMemcache.php
Removed:
    incubator/shindig/trunk/php/gadgets/src/FileCache.php
Modified:
    incubator/shindig/trunk/php/gadgets/config.php

Modified: incubator/shindig/trunk/php/gadgets/config.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/gadgets/config.php?rev=636489&r1=636488&r2=636489&view=diff
==============================================================================
--- incubator/shindig/trunk/php/gadgets/config.php (original)
+++ incubator/shindig/trunk/php/gadgets/config.php Wed Mar 12 13:13:54 2008
@@ -25,7 +25,7 @@
 	'remote_content' => 'BasicRemoteContent',
 	'gadget_signer' => 'BasicGadgetSigner',
 	'gadget_token' => 'BasicGadgetToken',
-	'data_cache' => 'FileCache',
+	'data_cache' => 'CacheFile',
 
 	// gadget server specific settings
 	'userpref_param_prefix'=> 'up_',
@@ -35,6 +35,11 @@
 	
 	// show debugging output ?
 	'debug'=> true,
+
+	// if your using memcached, these values are used for locating the server
+	// if your not using memcached, ignore these values
+	'cache_host' => 'localhost',
+	'cache_port'   => 11211,
 	
 	// global cache age policy and location
 	'cache_time'=> 24*60*60,

Copied: incubator/shindig/trunk/php/gadgets/src/CacheFile.php (from r636486, incubator/shindig/trunk/php/gadgets/src/FileCache.php)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/gadgets/src/CacheFile.php?p2=incubator/shindig/trunk/php/gadgets/src/CacheFile.php&p1=incubator/shindig/trunk/php/gadgets/src/FileCache.php&r1=636486&r2=636489&rev=636489&view=diff
==============================================================================
--- incubator/shindig/trunk/php/gadgets/src/FileCache.php (original)
+++ incubator/shindig/trunk/php/gadgets/src/CacheFile.php Wed Mar 12 13:13:54 2008
@@ -31,7 +31,7 @@
 
 //TODO add cache stampeding prevention using file locking mechanisms
 
-class FileCache extends Cache {
+class CacheFile extends Cache {
 	
 	function get($key)
 	{

Added: incubator/shindig/trunk/php/gadgets/src/CacheMemcache.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/gadgets/src/CacheMemcache.php?rev=636489&view=auto
==============================================================================
--- incubator/shindig/trunk/php/gadgets/src/CacheMemcache.php (added)
+++ incubator/shindig/trunk/php/gadgets/src/CacheMemcache.php Wed Mar 12 13:13:54 2008
@@ -0,0 +1,98 @@
+<?
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ * 
+ */
+
+/*
+ * This class impliments memcached based caching It'll generally be more
+ * usefull in a multi-server envirionment then the file based caching,
+ * (in a single server setup file based caching is actually faster)
+ */
+
+class CacheMemcache extends Cache {
+	private $connection = false;
+
+	public function __construct()
+	{
+		global $config;
+		if (!function_exists('memcache_connect')) {
+			throw new CacheException("Memcache functions not available");
+		}
+		if (empty($config['cache_host']) || empty($config['cache_port'])) {
+			throw new CacheException("You need to configure a cache server host and port to use the memcache backend");
+		}
+		$this->host = $config['cache_host'];
+		$this->port = $config['cache_port'];
+	}
+
+	public function __destruct()
+	{
+		// if we were connected, close the connection again
+		if (is_resource($this->connection)) {
+			memcache_close($this->connection);
+		}
+	}
+
+	// I prefer lazy initalization since the cache isn't used every request
+	// so this potentially saves a lot of overhead
+	private function connect()
+	{
+		if (!$this->connection = memcache_connect($this->host, $this->port)) {
+			throw new CacheException("Couldn't connect to memcache server");
+		}
+	}
+	
+	private function check()
+	{
+		if (!$this->connection) {
+			$this->connect();
+		}
+	}
+	
+	// using memcache_add behavior for cache stampeding prevention
+	private function add($key, $var, $timeout)
+	{
+		$this->check();
+		if (!memcache_add($this->connection, $key, $var, 0, $timeout)) {
+			throw new CacheException("Couldn't add to cache");
+		}
+	}
+	
+	public function get($key)
+	{
+		$this->check();
+		if (($ret = memcache_get($this->connection, $key)) === false) {
+			return false;
+		}
+		return $ret;
+	}
+	
+	public function set($key, $value)
+	{
+		global $config;
+		$this->check();
+		if (memcache_set($this->connection, $key, $value, 0, $config['cache_time']) === false) {
+			throw new CacheException("Couldn't store data in cache");
+		}
+	}
+	
+	function delete($key)
+	{
+
+	}
+}