path === null) { $this->path = $this->getConfig()->getParameterValue(self::CONFIG_PATH); if ($this->util->endsWith($this->path, DIRECTORY_SEPARATOR) === false) { $this->path .= DIRECTORY_SEPARATOR; } } return $this->path; } /** * @throws Exception */ public function init(): void { $path = $this->getPath(); if (is_dir($path) === false) { $this->php->mkdir($path, 0775, true); } $htaccessFile = $path . '.htaccess'; if (file_exists($htaccessFile) === false) { file_put_contents($htaccessFile, 'Deny from all'); } } /** * @throws Exception */ public function getConfig(): Config { if ($this->config === null) { $this->config = $this->configFactory->createConfig(self::CONFIG_KEY); $selections = [ self::METHOD_SERIALIZE, self::METHOD_JSON, self::METHOD_VAR_EXPORT ]; if ($this->php->functionExists('igbinary_serialize') === true) { $selections[] = self::METHOD_IGBINARY; } $configParameters = [ self::CONFIG_PATH => $this->configParameterFactory->createStringConfigParameter( self::CONFIG_PATH, $this->wordpress->getHomePath() . 'cache/uam' ), self::CONFIG_METHOD => $this->configParameterFactory->createSelectionConfigParameter( self::CONFIG_METHOD, self::METHOD_VAR_EXPORT, $selections ) ]; $this->config->setDefaultConfigParameters($configParameters); } return $this->config; } /** * @throws Exception */ private function getCacheMethod(): ?string { $method = (string) $this->getConfig()->getParameterValue(self::CONFIG_METHOD); if ($method === self::METHOD_IGBINARY && ($this->php->functionExists('igbinary_serialize') === false || $this->php->functionExists('igbinary_unserialize') === false) ) { $method = null; } return $method; } /** * @throws Exception */ private function getCacheFile(?string $method, string $key): string { $cacheFile = $this->getPath() . $key; $cacheFile .= ($method === self::METHOD_VAR_EXPORT) ? '.php' : '.cache'; return $cacheFile; } /** * @throws Exception */ public function add(string $key, mixed $value): void { $method = $this->getCacheMethod(); $cacheFile = $this->getCacheFile($method, $key); $content = match ($method) { self::METHOD_SERIALIZE => base64_encode(serialize($value)), self::METHOD_IGBINARY => $this->php->igbinarySerialize($value), self::METHOD_JSON => json_encode($value), self::METHOD_VAR_EXPORT => " null }; if ($content !== null) { $this->php->filePutContents($cacheFile, $content, LOCK_EX); } } private function includeCachedValue(string $cacheFile): mixed { $cachedValue = null; include($cacheFile); return $cachedValue; } /** * @throws Exception */ public function get(string $key): mixed { $method = $this->getCacheMethod(); $cacheFile = $this->getCacheFile($method, $key); if (file_exists($cacheFile) === false) { return null; } return match ($method) { self::METHOD_SERIALIZE => unserialize(base64_decode(file_get_contents($cacheFile))), self::METHOD_IGBINARY => $this->php->igbinaryUnserialize(file_get_contents($cacheFile)), self::METHOD_JSON => json_decode(file_get_contents($cacheFile), true), self::METHOD_VAR_EXPORT => $this->includeCachedValue($cacheFile), default => null }; } /** * @throws Exception */ public function invalidate(string $key): void { $method = $this->getCacheMethod(); $cacheFile = $this->getCacheFile($method, $key); if (file_exists($cacheFile) === true) { unlink($cacheFile); } } }