| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 | <?php/** * \ElggFileCache * Store cached data in a file store. * * @package    Elgg.Core * @subpackage Caches */class ElggFileCache extends \ElggCache {	/**	 * Set the Elgg cache.	 *	 * @param string $cache_path The cache path.	 * @param int    $max_age    Maximum age in seconds, 0 if no limit.	 * @param int    $max_size   Maximum size of cache in seconds, 0 if no limit.	 *	 * @throws ConfigurationException	 */	public function __construct($cache_path, $max_age = 0, $max_size = 0) {		$this->setVariable("cache_path", $cache_path);		$this->setVariable("max_age", $max_age);		$this->setVariable("max_size", $max_size);		if ($cache_path == "") {			throw new \ConfigurationException("Cache path set to nothing!");		}	}	// @codingStandardsIgnoreStart	/**	 * Create and return a handle to a file.	 *	 * @deprecated 1.8 Use \ElggFileCache::createFile()	 *	 * @param string $filename Filename to save as	 * @param string $rw       Write mode	 *	 * @return mixed	 */	protected function create_file($filename, $rw = "rb") {		elgg_deprecated_notice('\ElggFileCache::create_file() is deprecated by ::createFile()', 1.8);		return $this->createFile($filename, $rw);	}	// @codingStandardsIgnoreEnd	/**	 * Create and return a handle to a file.	 *	 * @param string $filename Filename to save as	 * @param string $rw       Write mode	 *	 * @return mixed	 */	protected function createFile($filename, $rw = "rb") {		// Create a filename matrix		$matrix = "";		$depth = strlen($filename);		if ($depth > 5) {			$depth = 5;		}		// Create full path		$path = $this->getVariable("cache_path") . $matrix;		if (!is_dir($path)) {			mkdir($path, 0700, true);		}		// Open the file		if ((!file_exists($path . $filename)) && ($rw == "rb")) {			return false;		}		return fopen($path . $filename, $rw);	}	// @codingStandardsIgnoreStart	/**	 * Create a sanitised filename for the file.	 *	 * @deprecated 1.8 Use \ElggFileCache::sanitizeFilename()	 *	 * @param string $filename The filename	 *	 * @return string	 */	protected function sanitise_filename($filename) {		// @todo : Writeme		return $filename;	}	// @codingStandardsIgnoreEnd	/**	 * Create a sanitised filename for the file.	 *	 * @param string $filename The filename	 *	 * @return string	 */	protected function sanitizeFilename($filename) {		// @todo : Writeme		return $filename;	}	/**	 * Save a key	 *	 * @param string $key  Name	 * @param string $data Value	 *	 * @return boolean	 */	public function save($key, $data) {		$f = $this->createFile($this->sanitizeFilename($key), "wb");		if ($f) {			$result = fwrite($f, $data);			fclose($f);			return $result;		}		return false;	}	/**	 * Load a key	 *	 * @param string $key    Name	 * @param int    $offset Offset	 * @param int    $limit  Limit	 *	 * @return string	 */	public function load($key, $offset = 0, $limit = null) {		$f = $this->createFile($this->sanitizeFilename($key));		if ($f) {			if (!$limit) {				$limit = -1;			}			$data = stream_get_contents($f, $limit, $offset);			fclose($f);			return $data;		}		return false;	}	/**	 * Invalidate a given key.	 *	 * @param string $key Name	 *	 * @return bool	 */	public function delete($key) {		$dir = $this->getVariable("cache_path");		if (file_exists($dir . $key)) {			return unlink($dir . $key);		}		return true;	}	/**	 * Delete all files in the directory of this file cache	 *	 * @return void	 */	public function clear() {		$dir = $this->getVariable("cache_path");		$exclude = array(".", "..");		$files = scandir($dir);		if (!$files) {			return;		}		foreach ($files as $f) {			if (!in_array($f, $exclude)) {				unlink($dir . $f);			}		}	}	/**	 * Preform cleanup and invalidates cache upon object destruction	 *	 * @throws IOException	 */	public function __destruct() {		// @todo Check size and age, clean up accordingly		$size = 0;		$dir = $this->getVariable("cache_path");		// Short circuit if both size and age are unlimited		if (($this->getVariable("max_age") == 0) && ($this->getVariable("max_size") == 0)) {			return;		}		$exclude = array(".", "..");		$files = scandir($dir);		if (!$files) {			throw new \IOException($dir . " is not a directory.");		}		// Perform cleanup		foreach ($files as $f) {			if (!in_array($f, $exclude)) {				$stat = stat($dir . $f);				// Add size				$size .= $stat['size'];				// Is this older than my maximum date?				if (($this->getVariable("max_age") > 0) && (time() - $stat['mtime'] > $this->getVariable("max_age"))) {					unlink($dir . $f);				}				// @todo Size			}		}	}}
 |