From c1cb9059ee60ae1bf1fd20afcf399b5616c8e740 Mon Sep 17 00:00:00 2001 From: Florian Pritz Date: Sat, 14 Aug 2010 18:08:03 +0200 Subject: use memcache Signed-off-by: Florian Pritz --- system/application/config/example/memcache.php | 9 ++ system/application/libraries/MemcacheLibrary.php | 182 +++++++++++++++++++++++ system/application/models/file_mod.php | 22 ++- 3 files changed, 210 insertions(+), 3 deletions(-) create mode 100644 system/application/config/example/memcache.php create mode 100644 system/application/libraries/MemcacheLibrary.php diff --git a/system/application/config/example/memcache.php b/system/application/config/example/memcache.php new file mode 100644 index 000000000..a5bc7e3a8 --- /dev/null +++ b/system/application/config/example/memcache.php @@ -0,0 +1,9 @@ + diff --git a/system/application/libraries/MemcacheLibrary.php b/system/application/libraries/MemcacheLibrary.php new file mode 100644 index 000000000..046a6f599 --- /dev/null +++ b/system/application/libraries/MemcacheLibrary.php @@ -0,0 +1,182 @@ + +* @license GNU General Public License +* @version 0.1 +*/ + + +class MemcacheLibrary { + + /** + * variable that holds memcached backend instance + * + * @var object + * @access public + */ + public $memcachedInstance; + + /** + * variable that holds servers for the memcache + * + * @var array + * @access public + */ + public $servers = array(); + + + /** + * main CodeIgniter instance + * + * @var object + * @access public + */ + public $CI; + + /** + * constructor function for the library + */ + public function __construct() { + + /* initialize memcached instance */ + if(class_exists("Memcache")) { + $this->memcachedInstance = new Memcache(); + } else { + throw new Exception( + "Memcached client doesn't exists in your PHP configuration" + ); + } + + /* load super CI instance */ + $this->CI =& get_instance(); + + /* load default server info */ + $this->CI->config->load("memcache"); + + /* connect to default server */ + if($this->CI->config->item("MEMCACHE_HOST") && $this->CI->config->item("MEMCACHE_PORT")) { + $this->addServer($this->CI->config->item("MEMCACHE_HOST"), $this->CI->config->item("MEMCACHE_PORT")); + } + + } + + /** + * adder function for the memcache servers + * + * @access public + * @return void + */ + public function addServer($server, $port) { + $this->servers[] = array( + "server" => $server, + "port" => $port, + ); + + $this->memcachedInstance->addServer($server, $port); + } + + /** + * gets related key from the memcache + * + * @access public + */ + public function get($key) { + $this->logDebugMessage(sprintf("%s key requested from memcache", $key)); + return $this->memcachedInstance->get($key); + } + + /** + * sets related key to the memcache + * + * @access public + */ + public function set($key, $value, $expire = null) { + $this->logDebugMessage( + sprintf("%s key set to memcache. (expire: %s)",$key, $expire) + ); + return $this->memcachedInstance->set($key, $value, null, $expire); + } + + /** + * deletes related key from the memcache + * + * @access public + */ + public function delete($key) { + $this->logDebugMessage(sprintf("%s key deleted from memcache.", $key)); + return $this->memcachedInstance->delete($key); + } + + /** + * increments related key from the memcache + * + * @access public + */ + public function increment($key, $offset = 1) { + $this->logDebugMessage(sprintf("%s key incremented %s times", $key, $offset)); + return $this->memcachedInstance->increment($key, $offset); + } + + /** + * decrements related key from the memcache + * + * @access public + */ + public function decrement($key, $offset = 1) { + $this->logDebugMessage(sprintf("%s key decremented %s times", $key, $offset)); + return $this->memcachedInstance->decrement($key, $offset); + } + + /** + * gets running memcached servers. + * + * @access public + * @return array + */ + public function getRunningServers() { + return $this->servers; + } + + /** + * array of server statistics, one entry per server. + * + * @access public + * @return array + */ + public function getStatistics() { + return $this->memcachedInstance->getStats(); + } + + /** + * Invalidates all items from the memcache. + * + * @access public + * @return boolean + */ + public function flush($delay = 0) { + $this->logDebugMessage(sprintf("memcache flushed! (delay: %s)", $delay)); + return $this->memcachedInstance->flush($delay); + } + + /** + * logs the memcache actions to the codeigniter's main logging system. + * + * @access private + */ + private function logDebugMessage($message) { + log_message("debug", $message); + } +} + + + + +?> diff --git a/system/application/models/file_mod.php b/system/application/models/file_mod.php index 8c197546c..07c3e5555 100644 --- a/system/application/models/file_mod.php +++ b/system/application/models/file_mod.php @@ -182,8 +182,16 @@ class File_mod extends Model { } echo $this->load->view('file/html_header', $data, true); if ($mode == "rmd") { - echo ''."\n"; - passthru('/usr/bin/perl /usr/bin/perlbin/vendor/Markdown.pl '.escapeshellarg($file)); + $this->load->library("MemcacheLibrary"); + if (! $cached = $this->memcachelibrary->get($filedata['hash'].'_'.$mode)) { + ob_start(); + echo ''."\n"; + passthru('/usr/bin/perl /usr/bin/perlbin/vendor/Markdown.pl '.escapeshellarg($file)); + $cached = ob_get_contents(); + ob_end_clean(); + $this->memcachelibrary->set($filedata['hash'].'_'.$mode, $cached, 100); + } + echo $cached; } else { echo '
';
             // only rewrite if it's fast
@@ -197,7 +205,15 @@ class File_mod extends Model {
               }
               fclose($fp);
             } else {
-              passthru('/usr/bin/pygmentize -l '.$mode.' -f html '.escapeshellarg($file));
+              $this->load->library("MemcacheLibrary");
+              if (! $cached = $this->memcachelibrary->get($filedata['hash'].'_'.$mode)) {
+                ob_start();
+                passthru('/usr/bin/pygmentize -l '.$mode.' -f html '.escapeshellarg($file));
+                $cached = ob_get_contents();
+                ob_end_clean();
+                $this->memcachelibrary->set($filedata['hash'].'_'.$mode, $cached, 100);
+              }
+              echo $cached;
             }
             echo '
'; } -- cgit v1.2.3-24-g4f1b