File: /home/armgroup/libs/vendor/chillerlan/php-cache/src/FileCache.php
<?php
/**
* Class FileCache
*
* @created 25.05.2017
* @author Smiley <smiley@chillerlan.net>
* @copyright 2017 Smiley
* @license MIT
*/
declare(strict_types=1);
namespace chillerlan\SimpleCache;
use DateInterval, FilesystemIterator, RecursiveDirectoryIterator, RecursiveIteratorIterator, stdClass;
use function dirname, file_get_contents, file_put_contents, hash, is_dir,
is_file, mkdir, serialize, str_replace, substr, time, unlink, unserialize;
use const DIRECTORY_SEPARATOR;
class FileCache extends CacheDriverAbstract{
/** @inheritdoc */
public function get(string $key, mixed $default = null):mixed{
$filename = $this->getFilepath($key);
if(is_file($filename)){
$content = file_get_contents($filename);
if(!empty($content)){
$data = unserialize($content);
if($data->ttl === null || $data->ttl > time()){
return $data->content;
}
unlink($filename);
}
}
return $default;
}
/** @inheritdoc */
public function set(string $key, mixed $value, int|DateInterval|null $ttl = null):bool{
$ttl = $this->getTTL($ttl);
$file = $this->getFilepath($key);
$dir = dirname($file);
if(!is_dir($dir)){
mkdir($dir, 0755, true);
}
$data = new stdClass;
$data->ttl = null;
$data->content = $value;
if($ttl !== null){
$data->ttl = (time() + $ttl);
}
file_put_contents($file, serialize($data));
if(is_file($file)){
return true;
}
return false; // @codeCoverageIgnore
}
/** @inheritdoc */
public function delete(string $key):bool{
$filename = $this->getFilepath($key);
if(is_file($filename)){
return unlink($filename);
}
return false;
}
/** @inheritdoc */
public function clear():bool{
$dir = $this->options->cacheFilestorage; // copy to avoid calling the magic getter in loop
$return = [];
$iterator = new RecursiveDirectoryIterator(
$dir,
(FilesystemIterator::CURRENT_AS_PATHNAME | FilesystemIterator::SKIP_DOTS)
);
foreach(new RecursiveIteratorIterator($iterator) as $path){
// skip files in the parent directory - cache files are only under /a/ab/[hash]
if(!str_contains(str_replace($dir, '', $path), DIRECTORY_SEPARATOR)){
continue;
}
$return[] = unlink($path);
}
return $this->checkReturn($return); // @codeCoverageIgnore
}
/**
*
*/
protected function getFilepath(mixed $key):string{
$h = hash('sha256', $this->checkKey($key));
$subdir = '';
for($i = 1; $i <= 3; $i++){ // @todo: subdir depth to options?
$subdir .= substr($h, 0, $i).DIRECTORY_SEPARATOR;
}
return $this->options->cacheFilestorage.$subdir.$h;
}
}