<?php namespace Todaymade\Daux; use Symfony\Component\Console\Output\OutputInterface; use Todaymade\Daux\Daux; class Cache { static $printed = false; public static function getDirectory(): string { $dir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . "dauxio" . DIRECTORY_SEPARATOR; if (!Cache::$printed) { Cache::$printed = true; Daux::writeln("Using cache dir '$dir'", OutputInterface::VERBOSITY_VERBOSE); } return $dir; } /** * Store an item in the cache for a given number of minutes. * * @param string $key * @param string $value * @return void */ public static function put(string $key, string $value): void { Cache::ensureCacheDirectoryExists($path = Cache::path($key)); file_put_contents($path, $value); } /** * Create the file cache directory if necessary. * * @param string $path * @return void */ protected static function ensureCacheDirectoryExists(string $path): void { $parent = dirname($path); if (!file_exists($parent)) { mkdir($parent, 0777, true); } } /** * Remove an item from the cache. * * @param string $key * @return bool */ public static function forget(string $key): bool { $path = Cache::path($key); if (file_exists($path)) { return unlink($path); } return false; } /** * Retrieve an item from the cache by key. * * @param string $key * @return mixed */ public static function get(string $key): ?string { $path = Cache::path($key); if (file_exists($path)) { return file_get_contents($path); } return null; } /** * Get the full path for the given cache key. * * @param string $key * @return string */ protected static function path(string $key): string { $parts = array_slice(str_split($hash = sha1($key), 2), 0, 2); return Cache::getDirectory() . '/' . implode('/', $parts) . '/' . $hash; } public static function clear(): void { Cache::rrmdir(Cache::getDirectory()); } protected static function rrmdir(string $dir): void { if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { if ($object != "." && $object != "..") { if (is_dir($dir . "/" . $object)) { Cache::rrmdir($dir . "/" . $object); } else { unlink($dir . "/" . $object); } } } rmdir($dir); } } }