| 
<?php
namespace Atto\Cache\storage;
 
 use Atto\Cache\Item;
 use Atto\Cache\Storage;
 
 /**
 * FileStorage class
 *
 * @package   Atto
 *
 * @namespace Atto\Cache\Storage
 * @name      Atto\Cache\Storage\FileStorage
 * @author    Andrei Alexandru Romila
 * @version   v1.0
 */
 class FileStorage implements Storage {
 
 /**
 * Directory path where the files are stored
 *
 * @var string
 */
 protected $directory;
 
 /**
 * FileStorage constructor
 *
 * @param string $directory Directory path where the cache file are stored
 */
 public function __construct($directory) {
 
 if (!is_dir($directory) && !@mkdir($directory, 0777, true)) {
 throw new \InvalidArgumentException("The directory $directory is invalid.");
 }
 
 if (!is_writable($directory)) {
 throw new \RuntimeException('Cache directory is not writable: "' . $directory . '".');
 }
 
 $this->directory = realpath($directory) . '/';
 }
 
 /**
 * Saves a new Item with the given key
 *
 * @param string $key
 * @param Item $item
 */
 public function save($key, Item $item) {
 // Get filename and contents
 $filename = $this->getFilename($key);
 $contents = serialize($item);
 
 // Write to the file
 file_put_contents($filename, $contents, LOCK_EX);
 }
 
 /**
 * Removes the indicated Item from the storage
 *
 * @param string $key
 */
 public function delete($key) {
 // Get filename
 $filename = $this->getFilename($key);
 
 if (is_file($filename)) {
 unlink($filename);
 }
 }
 
 /**
 * Returns the Item associated with the given key
 *
 * @param string $key
 *
 * @return Item|null
 */
 public function getItem($key) {
 $filename = $this->getFilename($key);
 
 if (is_file($filename)) {
 return unserialize(file_get_contents($filename));
 }
 
 return null;
 }
 
 /**
 * Returns the filename for the current key
 *
 * @param string $key
 *
 * @return string
 */
 protected function getFilename($key) {
 return $this->directory . sha1($key);
 }
 }
 
 |