Chris@0: . Chris@0: */ Chris@0: Chris@0: namespace Doctrine\Common\Cache; Chris@0: Chris@0: /** Chris@0: * Php file cache driver. Chris@0: * Chris@0: * @since 2.3 Chris@0: * @author Fabio B. Silva Chris@0: */ Chris@0: class PhpFileCache extends FileCache Chris@0: { Chris@0: const EXTENSION = '.doctrinecache.php'; Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function __construct($directory, $extension = self::EXTENSION, $umask = 0002) Chris@0: { Chris@0: parent::__construct($directory, $extension, $umask); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function doFetch($id) Chris@0: { Chris@0: $value = $this->includeFileForId($id); Chris@0: Chris@0: if (! $value) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: if ($value['lifetime'] !== 0 && $value['lifetime'] < time()) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: return $value['data']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function doContains($id) Chris@0: { Chris@0: $value = $this->includeFileForId($id); Chris@0: Chris@0: if (! $value) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: return $value['lifetime'] === 0 || $value['lifetime'] > time(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function doSave($id, $data, $lifeTime = 0) Chris@0: { Chris@0: if ($lifeTime > 0) { Chris@0: $lifeTime = time() + $lifeTime; Chris@0: } Chris@0: Chris@0: if (is_object($data) && ! method_exists($data, '__set_state')) { Chris@0: throw new \InvalidArgumentException( Chris@0: "Invalid argument given, PhpFileCache only allows objects that implement __set_state() " . Chris@0: "and fully support var_export(). You can use the FilesystemCache to save arbitrary object " . Chris@0: "graphs using serialize()/deserialize()." Chris@0: ); Chris@0: } Chris@0: Chris@0: $filename = $this->getFilename($id); Chris@0: Chris@0: $value = array( Chris@0: 'lifetime' => $lifeTime, Chris@0: 'data' => $data Chris@0: ); Chris@0: Chris@0: $value = var_export($value, true); Chris@0: $code = sprintf('writeFile($filename, $code); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $id Chris@0: * Chris@0: * @return array|false Chris@0: */ Chris@0: private function includeFileForId($id) Chris@0: { Chris@0: $fileName = $this->getFilename($id); Chris@0: Chris@0: // note: error suppression is still faster than `file_exists`, `is_file` and `is_readable` Chris@0: $value = @include $fileName; Chris@0: Chris@0: if (! isset($value['lifetime'])) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: return $value; Chris@0: } Chris@0: }