simple cache for rendered files
authorChristian Weiske <cweiske@cweiske.de>
Tue, 7 Jul 2015 14:10:56 +0000 (16:10 +0200)
committerChristian Weiske <cweiske@cweiske.de>
Tue, 7 Jul 2015 14:10:56 +0000 (16:10 +0200)
.gitignore
data/config.default.php
src/phorkie/File.php
src/phorkie/Renderer/Cache.php [new file with mode: 0644]
src/phorkie/Repository.php
src/phorkie/SetupCheck.php
www/setup.php

index 6235ed5..f9dbcb1 100644 (file)
@@ -8,3 +8,4 @@
 /src/gen-rewritemap.php
 /www/*.phar
 /www/*.phar.bz2
+/data/cache/
index d603622..c062d02 100644 (file)
@@ -15,6 +15,7 @@ $GLOBALS['phorkie']['cfg'] = array(
         'public'    => '%BASEURL%' . 'repos/git/',
         'private'   => null,
     ),
+    'cachedir'      => __DIR__ . '/cache/',
     'gitdir'        => $wwwDir . 'repos/git/',
     'workdir'       => $wwwDir . 'repos/work/',
     'tpl'           => __DIR__ . '/templates/',
index 2afda4c..300e810 100644 (file)
@@ -84,22 +84,8 @@ class File
 
     public function getRenderedContent(Tool_Result $res = null)
     {
-        $ext   = $this->getExt();
-        $class = '\\phorkie\\Renderer_Unknown';
-
-        if (isset($GLOBALS['phorkie']['languages'][$ext]['renderer'])) {
-            $class = $GLOBALS['phorkie']['languages'][$ext]['renderer'];
-        } else if ($this->isText()) {
-            $class = '\\phorkie\\Renderer_Geshi';
-        } else if (isset($GLOBALS['phorkie']['languages'][$ext]['mime'])) {
-            $type = $GLOBALS['phorkie']['languages'][$ext]['mime'];
-            if (substr($type, 0, 6) == 'image/') {
-                $class = '\\phorkie\\Renderer_Image';
-            }
-        }
-
-        $rend = new $class();
-        return $rend->toHtml($this, $res);
+        $cache = new Renderer_Cache();
+        return $cache->toHtml($this, $res);
     }
 
     /**
diff --git a/src/phorkie/Renderer/Cache.php b/src/phorkie/Renderer/Cache.php
new file mode 100644 (file)
index 0000000..4137b05
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+namespace phorkie;
+
+class Renderer_Cache
+{
+    /**
+     * Converts the code to HTML by fetching it from cache,
+     * or by letting the other renderes generate it and then
+     * storing it in the cache.
+     *
+     * @param File        $file File to render
+     * @param Tool_Result $res  Tool result to integrate
+     *
+     * @return string HTML
+     */
+    public function toHtml(File $file, Tool_Result $res = null)
+    {
+        $html = null;
+        $cacheFile = $this->getCacheFile($file);
+        if ($res === null && $cacheFile !== null) {
+            $html = $this->loadHtmlFromCache($cacheFile);
+        }
+        if ($html === null) {
+            $html = $this->renderFile($file, $res);
+            if ($res === null && $cacheFile !== null) {
+                $this->storeHtmlIntoCache($cacheFile, $html);
+            }
+        }
+        return $html;
+    }
+
+    protected function renderFile(File $file, Tool_Result $res = null)
+    {
+        $ext   = $file->getExt();
+        $class = '\\phorkie\\Renderer_Unknown';
+
+        if (isset($GLOBALS['phorkie']['languages'][$ext]['renderer'])) {
+            $class = $GLOBALS['phorkie']['languages'][$ext]['renderer'];
+        } else if ($file->isText()) {
+            $class = '\\phorkie\\Renderer_Geshi';
+        } else if (isset($GLOBALS['phorkie']['languages'][$ext]['mime'])) {
+            $type = $GLOBALS['phorkie']['languages'][$ext]['mime'];
+            if (substr($type, 0, 6) == 'image/') {
+                $class = '\\phorkie\\Renderer_Image';
+            }
+        }
+
+        $rend = new $class();
+        return $rend->toHtml($file, $res);
+    }
+
+    /**
+     * @return null|string NULL when there is no cache, string with HTML
+     *                     otherwise
+     */
+    protected function loadHtmlFromCache($cacheFile)
+    {
+        if (!file_exists($cacheFile)) {
+            return null;
+        }
+        return file_get_contents($cacheFile);
+    }
+
+    protected function storeHtmlIntoCache($cacheFile, $html)
+    {
+        file_put_contents($cacheFile, $html);
+    }
+
+    protected function getCacheFile(File $file)
+    {
+        if (!$GLOBALS['phorkie']['cfg']['cachedir']
+            || !is_dir($GLOBALS['phorkie']['cfg']['cachedir'])
+        ) {
+            return null;
+        }
+
+        return $GLOBALS['phorkie']['cfg']['cachedir']
+            . '/' . $file->repo->id
+            . '-' . $file->repo->hash
+            . '-' . str_replace('/', '-', $file->getFilename())
+            . '.html';
+    }
+}
+?>
index 8cf5ff6..62a6e38 100644 (file)
@@ -96,7 +96,6 @@ class Repository
 
     public function loadHash()
     {
-        return;
         if ($this->hash !== null) {
             return;
         }
index 32fb79e..9cae724 100644 (file)
@@ -26,6 +26,7 @@ class SetupCheck
         $this->writableDirs = array(
             'gitdir'  => Tools::foldPath($cfg['gitdir']),
             'workdir' => Tools::foldPath($cfg['workdir']),
+            'cachedir' => Tools::foldPath($cfg['cachedir']),
         );
         $this->elasticsearch = $cfg['elasticsearch'];
     }
index 485c19f..c7320d8 100644 (file)
@@ -36,6 +36,7 @@ $out = <<<HTM
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
   <title>phorkie setup check</title>
+  <meta charset="utf-8" />
   <link rel="stylesheet" href="css/bootstrap.min.css"/>
   <link rel="stylesheet" href="css/font-awesome.css"/>
   <link rel="stylesheet" href="css/phorkie.css"/>