diff options
Diffstat (limited to 'min/lib/Minify/Cache')
| -rw-r--r-- | min/lib/Minify/Cache/APC.php | 130 | ||||
| -rw-r--r-- | min/lib/Minify/Cache/File.php | 125 | ||||
| -rw-r--r-- | min/lib/Minify/Cache/Memcache.php | 137 | 
3 files changed, 392 insertions, 0 deletions
| diff --git a/min/lib/Minify/Cache/APC.php b/min/lib/Minify/Cache/APC.php new file mode 100644 index 0000000..ca84d29 --- /dev/null +++ b/min/lib/Minify/Cache/APC.php @@ -0,0 +1,130 @@ +<?php +/** + * Class Minify_Cache_APC + * @package Minify + */ + +/** + * APC-based cache class for Minify + *  + * <code> + * Minify::setCache(new Minify_Cache_APC()); + * </code> + *  + * @package Minify + * @author Chris Edwards + **/ +class Minify_Cache_APC { + +    /** +     * Create a Minify_Cache_APC 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 apc_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) +    { +        return $this->_fetch($id) +            ? strlen($this->_data) +            : false; +    } + +    /** +     * 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 apc, store in instance +     * +     * @param string $id +     * +     * @return bool success +     */ +    private function _fetch($id) +    { +        if ($this->_id === $id) { +            return true; +        } +        $ret = apc_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/min/lib/Minify/Cache/File.php b/min/lib/Minify/Cache/File.php new file mode 100644 index 0000000..2753e6b --- /dev/null +++ b/min/lib/Minify/Cache/File.php @@ -0,0 +1,125 @@ +<?php +/** + * Class Minify_Cache_File   + * @package Minify + */ + +class Minify_Cache_File { +     +    public function __construct($path = '', $fileLocking = false) +    { +        if (! $path) { +            require_once 'Solar/Dir.php'; +            $path = rtrim(Solar_Dir::tmp(), DIRECTORY_SEPARATOR); +        } +        $this->_locking = $fileLocking; +        $this->_path = $path; +    } +     +    /** +     * Write data to cache. +     * +     * @param string $id cache id (e.g. a filename) +     *  +     * @param string $data +     *  +     * @return bool success +     */ +    public function store($id, $data) +    { +        $flag = $this->_locking +            ? LOCK_EX +            : null; +        if (is_file($this->_path . '/' . $id)) { +            @unlink($this->_path . '/' . $id); +        } +        if (! @file_put_contents($this->_path . '/' . $id, $data, $flag)) { +            return false; +        } +        // write control +        if ($data !== $this->fetch($id)) { +            @unlink($file); +            return false; +        } +        return true; +    } +     +    /** +     * Get the size of a cache entry +     * +     * @param string $id cache id (e.g. a filename) +     *  +     * @return int size in bytes +     */ +    public function getSize($id) +    { +        return filesize($this->_path . '/' . $id); +    } +     +    /** +     * Does a valid cache entry exist? +     * +     * @param string $id cache id (e.g. a filename) +     *  +     * @param int $srcMtime mtime of the original source file(s) +     *  +     * @return bool exists +     */ +    public function isValid($id, $srcMtime) +    { +        $file = $this->_path . '/' . $id; +        return (is_file($file) && (filemtime($file) >= $srcMtime)); +    } +     +    /** +     * Send the cached content to output +     * +     * @param string $id cache id (e.g. a filename) +     */ +    public function display($id) +    { +        if ($this->_locking) { +            $fp = fopen($this->_path . '/' . $id, 'rb'); +            flock($fp, LOCK_SH); +            fpassthru($fp); +            flock($fp, LOCK_UN); +            fclose($fp); +        } else { +            readfile($this->_path . '/' . $id);             +        } +    } +     +	/** +     * Fetch the cached content +     * +     * @param string $id cache id (e.g. a filename) +     *  +     * @return string +     */ +    public function fetch($id) +    { +        if ($this->_locking) { +            $fp = fopen($this->_path . '/' . $id, 'rb'); +            flock($fp, LOCK_SH); +            $ret = stream_get_contents($fp); +            flock($fp, LOCK_UN); +            fclose($fp); +            return $ret; +        } else { +            return file_get_contents($this->_path . '/' . $id); +        } +    } +     +    /** +     * Fetch the cache path used +     * +     * @return string +     */ +    public function getPath() +    { +        return $this->_path; +    } +     +    private $_path = null; +    private $_locking = null; +} diff --git a/min/lib/Minify/Cache/Memcache.php b/min/lib/Minify/Cache/Memcache.php new file mode 100644 index 0000000..2b81e7a --- /dev/null +++ b/min/lib/Minify/Cache/Memcache.php @@ -0,0 +1,137 @@ +<?php +/** + * Class Minify_Cache_Memcache + * @package Minify + */ + +/** + * Memcache-based cache class for Minify + *  + * <code> + * // fall back to disk caching if memcache can't connect + * $memcache = new Memcache; + * if ($memcache->connect('localhost', 11211)) { + *     Minify::setCache(new Minify_Cache_Memcache($memcache)); + * } else { + *     Minify::setCache(); + * } + * </code> + **/ +class Minify_Cache_Memcache { +     +    /** +     * Create a Minify_Cache_Memcache object, to be passed to  +     * Minify::setCache(). +     * +     * @param Memcache $memcache already-connected instance +     *  +     * @param int $expire seconds until expiration (default = 0 +     * meaning the item will not get an expiration date) +     *  +     * @return null +     */ +    public function __construct($memcache, $expire = 0) +    { +        $this->_mc = $memcache; +        $this->_exp = $expire; +    } +     +    /** +     * Write data to cache. +     * +     * @param string $id cache id +     *  +     * @param string $data +     *  +     * @return bool success +     */ +    public function store($id, $data) +    { +        return $this->_mc->set($id, "{$_SERVER['REQUEST_TIME']}|{$data}", 0, $this->_exp); +    } +     +     +    /** +     * Get the size of a cache entry +     * +     * @param string $id cache id +     *  +     * @return int size in bytes +     */ +    public function getSize($id) +    { +        return $this->_fetch($id) +            ? strlen($this->_data) +            : false; +    } +     +    /** +     * 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 $_mc = null; +    private $_exp = null; +     +    // cache of most recently fetched id +    private $_lm = null; +    private $_data = null; +    private $_id = null; +     +	/** +     * Fetch data and timestamp from memcache, store in instance +     *  +     * @param string $id +     *  +     * @return bool success +     */ +    private function _fetch($id) +    { +        if ($this->_id === $id) { +            return true; +        } +        $ret = $this->_mc->get($id); +        if (false === $ret) { +            $this->_id = null; +            return false; +        } +        list($this->_lm, $this->_data) = explode('|', $ret, 2); +        $this->_id = $id; +        return true; +    } +} | 
