directory = $directory; $this->smartFileSystem = $smartFileSystem; } /** * @param string $key * @param string $variableKey */ public function load($key, $variableKey) { return (function (string $key, string $variableKey) { $cacheFilePaths = $this->getCacheFilePaths($key); $filePath = $cacheFilePaths->getFilePath(); if (!\is_file($filePath)) { return null; } $cacheItem = (require $filePath); if (!$cacheItem instanceof \Rector\Caching\ValueObject\CacheItem) { return null; } if (!$cacheItem->isVariableKeyValid($variableKey)) { return null; } return $cacheItem->getData(); })($key, $variableKey); } /** * @param string $key * @param string $variableKey */ public function save($key, $variableKey, $data) : void { $cacheFilePaths = $this->getCacheFilePaths($key); $this->smartFileSystem->mkdir($cacheFilePaths->getFirstDirectory()); $this->smartFileSystem->mkdir($cacheFilePaths->getSecondDirectory()); $path = $cacheFilePaths->getFilePath(); $tmpPath = \sprintf('%s/%s.tmp', $this->directory, \RectorPrefix20210808\Nette\Utils\Random::generate()); $errorBefore = \error_get_last(); $exported = @\var_export(new \Rector\Caching\ValueObject\CacheItem($variableKey, $data), \true); $errorAfter = \error_get_last(); if ($errorAfter !== null && $errorBefore !== $errorAfter) { throw new \RectorPrefix20210808\Symplify\EasyCodingStandard\Caching\Exception\CachingException(\sprintf('Error occurred while saving item %s (%s) to cache: %s', $key, $variableKey, $errorAfter['message'])); } // for performance reasons we don't use SmartFileSystem \PHPStan\File\FileWriter::write($tmpPath, \sprintf("getCacheFilePaths($key); $this->smartFileSystem->remove([$cacheFilePaths->getFirstDirectory(), $cacheFilePaths->getSecondDirectory(), $cacheFilePaths->getFilePath()]); } public function clear() : void { $this->smartFileSystem->remove($this->directory); } private function getCacheFilePaths(string $key) : \Rector\Caching\ValueObject\CacheFilePaths { $keyHash = \sha1($key); $firstDirectory = \sprintf('%s/%s', $this->directory, \substr($keyHash, 0, 2)); $secondDirectory = \sprintf('%s/%s', $firstDirectory, \substr($keyHash, 2, 2)); $filePath = \sprintf('%s/%s.php', $secondDirectory, $keyHash); return new \Rector\Caching\ValueObject\CacheFilePaths($firstDirectory, $secondDirectory, $filePath); } }