From 455084b2843ad1565401cb4b3bb0d89e2b055649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=B6nsch?= Date: Sat, 1 Oct 2022 22:23:52 +0200 Subject: [PATCH] Minify_Cache_APCu replaces APC --- lib/Minify/Cache/APC.php | 2 + lib/Minify/Cache/APCu.php | 136 ++++++++++++++++++++++++++++++++++ tests/MinifyCacheAPCTest.php | 1 - tests/MinifyCacheAPCuTest.php | 25 +++++++ 4 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 lib/Minify/Cache/APCu.php create mode 100644 tests/MinifyCacheAPCuTest.php diff --git a/lib/Minify/Cache/APC.php b/lib/Minify/Cache/APC.php index 85a0b49..79ddf46 100644 --- a/lib/Minify/Cache/APC.php +++ b/lib/Minify/Cache/APC.php @@ -13,6 +13,8 @@ * * @package Minify * @author Chris Edwards + * + * @deprecated Use Minify_Cache_APCu **/ class Minify_Cache_APC implements Minify_CacheInterface { diff --git a/lib/Minify/Cache/APCu.php b/lib/Minify/Cache/APCu.php new file mode 100644 index 0000000..170b3f2 --- /dev/null +++ b/lib/Minify/Cache/APCu.php @@ -0,0 +1,136 @@ + + * Minify::setCache(new Minify_Cache_APCu()); + * + * + * @package Minify + * @author Chris Edwards + **/ +class Minify_Cache_APCu implements Minify_CacheInterface +{ + + /** + * Create a Minify_Cache_APCu object, to be passed to + * Minify::setCache(). + * + * + * @param int $expire seconds until expiration (default = 0 + * meaning the item will not get an expiration date) + * + * @return null + */ + public function __construct($expire = 0) + { + $this->_exp = $expire; + } + + /** + * Write data to cache. + * + * @param string $id cache id + * + * @param string $data + * + * @return bool success + */ + public function store($id, $data) + { + return apcu_store($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; + } + + if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) { + return mb_strlen($this->_data, '8bit'); + } else { + return 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 apcu, store in instance + * + * @param string $id + * + * @return bool success + */ + private function _fetch($id) + { + if ($this->_id === $id) { + return true; + } + $ret = apcu_fetch($id); + if (false === $ret) { + $this->_id = null; + + return false; + } + + list($this->_lm, $this->_data) = explode('|', $ret, 2); + $this->_id = $id; + + return true; + } +} diff --git a/tests/MinifyCacheAPCTest.php b/tests/MinifyCacheAPCTest.php index 15b3b69..0f31b82 100644 --- a/tests/MinifyCacheAPCTest.php +++ b/tests/MinifyCacheAPCTest.php @@ -9,7 +9,6 @@ class MinifyCacheAPCTest extends TestCase public function setUp() { if (!function_exists('apc_store')) { - // FIXME: is APCu extension ok too? $this->markTestSkipped("To test this component, install APC extension"); } } diff --git a/tests/MinifyCacheAPCuTest.php b/tests/MinifyCacheAPCuTest.php new file mode 100644 index 0000000..187dc06 --- /dev/null +++ b/tests/MinifyCacheAPCuTest.php @@ -0,0 +1,25 @@ +markTestSkipped("To test this component, install APCu extension"); + } + ini_set('apc.enable_cli', 1); + } + + public function test1() + { + $data = str_repeat(md5(time()) . 'í', 100); // 3400 bytes in UTF-8 + $id = 'Minify_test_cache'; + + $cache = new Minify_Cache_APCu(); + $this->assertTestCache($cache, $id, $data); + } +}