<?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);
}
}
|