From 6b469640a7704b3e58589fe25c3032a3a17b6f29 Mon Sep 17 00:00:00 2001 From: Matthias Fax Date: Thu, 12 Jun 2014 13:18:10 +0200 Subject: [PATCH] Add Wincache Updated comments Check for Wincache existence in constructor Normalized markup Add Wincache test Tie Wincache test to test index --- min/lib/Minify/Cache/WinCache.php | 130 ++++++++++++++++++ min_unit_tests/test_Minify_Cache_WinCache.php | 31 +++++ min_unit_tests/test_all.php | 1 + 3 files changed, 162 insertions(+) create mode 100644 min/lib/Minify/Cache/WinCache.php create mode 100644 min_unit_tests/test_Minify_Cache_WinCache.php diff --git a/min/lib/Minify/Cache/WinCache.php b/min/lib/Minify/Cache/WinCache.php new file mode 100644 index 0000000..500bdd8 --- /dev/null +++ b/min/lib/Minify/Cache/WinCache.php @@ -0,0 +1,130 @@ + + * Minify::setCache(new Minify_Cache_WinCache()); + * + * + * @package Minify + * @author Matthias Fax + **/ +class Minify_Cache_WinCache +{ + + /** + * Create a Minify_Cache_Wincache object, to be passed to + * Minify::setCache(). + * + * + * @param int $expire seconds until expiration (default = 0 + * meaning the item will not get an expiration date) + */ + public function __construct($expire = 0) + { + if (!function_exists('wincache_ucache_info')) { + throw new Exception("WinCache for PHP is not installed to be able to use Minify_Cache_WinCache!"); + } + $this->_exp = $expire; + } + + /** + * Write data to cache. + * + * @param string $id cache id + * + * @param string $data + * + * @return bool success + */ + public function store($id, $data) + { + return wincache_ucache_set($id, "{$_SERVER['REQUEST_TIME']}|{$data}", $this->_exp); + } + + /** + * Get the size of a cache entry + * + * @param string $id cache id + * + * @return int size in bytes + */ + public function getSize($id) + { + if (!$this->_fetch($id)) { + return false; + } + return (function_exists('mb_strlen') && ((int) ini_get('mbstring.func_overload') & 2)) ? mb_strlen($this->_data, '8bit') : strlen($this->_data); + } + + /** + * Does a valid cache entry exist? + * + * @param string $id cache id + * + * @param int $srcMtime mtime of the original source file(s) + * + * @return bool exists + */ + public function isValid($id, $srcMtime) + { + return ($this->_fetch($id) && ($this->_lm >= $srcMtime)); + } + + /** + * Send the cached content to output + * + * @param string $id cache id + */ + public function display($id) + { + echo $this->_fetch($id) ? $this->_data : ''; + } + + /** + * Fetch the cached content + * + * @param string $id cache id + * + * @return string + */ + public function fetch($id) + { + return $this->_fetch($id) ? $this->_data : ''; + } + + private $_exp = NULL; + + // cache of most recently fetched id + private $_lm = NULL; + private $_data = NULL; + private $_id = NULL; + + /** + * Fetch data and timestamp from WinCache, store in instance + * + * @param string $id + * + * @return bool success + */ + private function _fetch($id) + { + if ($this->_id === $id) { + return true; + } + $suc = false; + $ret = wincache_ucache_get($id, $suc); + if (!$suc) { + $this->_id = NULL; + return false; + } + list($this->_lm, $this->_data) = explode('|', $ret, 2); + $this->_id = $id; + return true; + } +} \ No newline at end of file diff --git a/min_unit_tests/test_Minify_Cache_WinCache.php b/min_unit_tests/test_Minify_Cache_WinCache.php new file mode 100644 index 0000000..64fa60e --- /dev/null +++ b/min_unit_tests/test_Minify_Cache_WinCache.php @@ -0,0 +1,31 @@ +store($id, $data), $prefix . 'store'); + + assertTrue(countBytes($data) === $cache->getSize($id), $prefix . 'getSize'); + + assertTrue(true === $cache->isValid($id, $_SERVER['REQUEST_TIME'] - 10), $prefix . 'isValid'); + + ob_start(); + $cache->display($id); + $displayed = ob_get_contents(); + ob_end_clean(); + + assertTrue($data === $displayed, $prefix . 'display'); + + assertTrue($data === $cache->fetch($id), $prefix . 'fetch'); +} + +test_Minify_Cache_WinCache(); \ No newline at end of file diff --git a/min_unit_tests/test_all.php b/min_unit_tests/test_all.php index c654b6a..5b76ff9 100644 --- a/min_unit_tests/test_all.php +++ b/min_unit_tests/test_all.php @@ -6,6 +6,7 @@ require 'test_Minify_HTML_Helper.php'; require 'test_Minify_Cache_APC.php'; require 'test_Minify_Cache_File.php'; require 'test_Minify_Cache_Memcache.php'; +require 'test_Minify_Cache_WinCache.php'; require 'test_Minify_Cache_ZendPlatform.php'; require 'test_Minify_CSS.php'; require 'test_Minify_CSS_UriRewriter.php';