65 if ($this->frozen ===
true) {
66 throw new \RuntimeException(sprintf(
'The cache "%s" is already frozen.', $this->cacheIdentifier), 1323353176);
68 $cacheEntryFileExtensionLength = strlen($this->cacheEntryFileExtension);
69 for ($directoryIterator =
new \DirectoryIterator($this->cacheDirectory); $directoryIterator->valid(); $directoryIterator->next()) {
70 if ($directoryIterator->isDot()) {
73 if ($cacheEntryFileExtensionLength > 0) {
74 $entryIdentifier = substr($directoryIterator->getFilename(), 0, -$cacheEntryFileExtensionLength);
76 $entryIdentifier = $directoryIterator->getFilename();
78 $this->cacheEntryIdentifiers[$entryIdentifier] =
true;
79 file_put_contents($this->cacheDirectory . $entryIdentifier . $this->cacheEntryFileExtension, $this->
get($entryIdentifier));
81 file_put_contents($this->cacheDirectory .
'FrozenCache.data', serialize($this->cacheEntryIdentifiers));
107 if (file_exists($this->cacheDirectory .
'FrozenCache.data')) {
108 $this->frozen =
true;
109 $this->cacheEntryIdentifiers = unserialize(file_get_contents($this->cacheDirectory .
'FrozenCache.data'));
125 public function set($entryIdentifier, $data, array $tags = [], $lifetime =
null)
127 if (!is_string($data)) {
128 throw new InvalidDataException(
'The specified data is of type "' . gettype($data) .
'" but a string is expected.', 1204481674);
131 throw new \InvalidArgumentException(
'The specified entry identifier must not contain a path segment.', 1282073032);
133 if ($entryIdentifier ===
'') {
134 throw new \InvalidArgumentException(
'The specified entry identifier must not be empty.', 1298114280);
136 if ($this->frozen ===
true) {
137 throw new \RuntimeException(sprintf(
'Cannot add or modify cache entry because the backend of cache "%s" is frozen.', $this->cacheIdentifier), 1323344192);
139 $this->
remove($entryIdentifier);
142 $expiryTime = $lifetime === 0 ? 0 :
$GLOBALS[
'EXEC_TIME'] + $lifetime;
143 $metaData = str_pad($expiryTime, self::EXPIRYTIME_LENGTH) . implode(
' ', $tags) . str_pad(strlen($data), self::DATASIZE_DIGITS);
144 $result = file_put_contents($temporaryCacheEntryPathAndFilename, $data . $metaData);
145 GeneralUtility::fixPermissions($temporaryCacheEntryPathAndFilename);
146 if ($result ===
false) {
147 throw new Exception(
'The temporary cache file "' . $temporaryCacheEntryPathAndFilename .
'" could not be written.', 1204026251);
151 while (($result = rename($temporaryCacheEntryPathAndFilename, $cacheEntryPathAndFilename)) ===
false && $i < 5) {
154 if ($result ===
false) {
155 throw new Exception(
'The cache file "' . $cacheEntryPathAndFilename .
'" could not be written.', 1222361632);
157 if ($this->cacheEntryFileExtension ===
'.php') {
158 GeneralUtility::makeInstance(OpcodeCacheService::class)->clearAllActive($cacheEntryPathAndFilename);
169 public function get($entryIdentifier)
171 if ($this->frozen ===
true) {
172 return isset($this->cacheEntryIdentifiers[$entryIdentifier]) ? file_get_contents($this->cacheDirectory . $entryIdentifier . $this->cacheEntryFileExtension) : false;
175 throw new \InvalidArgumentException(
'The specified entry identifier must not contain a path segment.', 1282073033);
181 $dataSize = (int)file_get_contents(
188 return file_get_contents($pathAndFilename,
null,
null, 0, $dataSize);
198 public function has($entryIdentifier)
200 if ($this->frozen ===
true) {
201 return isset($this->cacheEntryIdentifiers[$entryIdentifier]);
204 throw new \InvalidArgumentException(
'The specified entry identifier must not contain a path segment.', 1282073034);
206 return !$this->
isCacheFileExpired($this->cacheDirectory . $entryIdentifier . $this->cacheEntryFileExtension);
218 public function remove($entryIdentifier)
221 throw new \InvalidArgumentException(
'The specified entry identifier must not contain a path segment.', 1282073035);
223 if ($entryIdentifier ===
'') {
224 throw new \InvalidArgumentException(
'The specified entry identifier must not be empty.', 1298114279);
226 if ($this->frozen ===
true) {
227 throw new \RuntimeException(sprintf(
'Cannot remove cache entry because the backend of cache "%s" is frozen.', $this->cacheIdentifier), 1323344193);
230 if (file_exists($pathAndFilename) ===
false) {
233 if (@unlink($pathAndFilename) ===
false) {
248 $entryIdentifiers = [];
250 $cacheEntryFileExtensionLength = strlen($this->cacheEntryFileExtension);
251 for ($directoryIterator = GeneralUtility::makeInstance(\DirectoryIterator::class, $this->cacheDirectory); $directoryIterator->valid(); $directoryIterator->next()) {
252 if ($directoryIterator->isDot()) {
255 $cacheEntryPathAndFilename = $directoryIterator->getPathname();
256 $index = (int)file_get_contents(
257 $cacheEntryPathAndFilename,
263 $metaData = file_get_contents($cacheEntryPathAndFilename,
null,
null, $index);
264 $expiryTime = (int)substr($metaData, 0, self::EXPIRYTIME_LENGTH);
265 if ($expiryTime !== 0 && $expiryTime < $now) {
268 if (in_array($searchedTag, explode(
' ', substr($metaData, self::EXPIRYTIME_LENGTH, -self::DATASIZE_DIGITS)))) {
269 if ($cacheEntryFileExtensionLength > 0) {
270 $entryIdentifiers[] = substr($directoryIterator->getFilename(), 0, -$cacheEntryFileExtensionLength);
272 $entryIdentifiers[] = $directoryIterator->getFilename();
276 return $entryIdentifiers;
285 if ($this->frozen ===
true) {
286 $this->frozen =
false;
298 if (empty($identifiers)) {
301 foreach ($identifiers as $entryIdentifier) {
302 $this->
remove($entryIdentifier);
315 if (file_exists($cacheEntryPathAndFilename) ===
false) {
318 $index = (int)file_get_contents(
319 $cacheEntryPathAndFilename,
325 $expiryTime = (int)file_get_contents($cacheEntryPathAndFilename,
null,
null, $index, self::EXPIRYTIME_LENGTH);
326 return $expiryTime !== 0 && $expiryTime <
$GLOBALS[
'EXEC_TIME'];
334 if ($this->frozen ===
true) {
337 for ($directoryIterator =
new \DirectoryIterator($this->cacheDirectory); $directoryIterator->valid(); $directoryIterator->next()) {
338 if ($directoryIterator->isDot()) {
342 $cacheEntryFileExtensionLength = strlen($this->cacheEntryFileExtension);
343 if ($cacheEntryFileExtensionLength > 0) {
344 $this->
remove(substr($directoryIterator->getFilename(), 0, -$cacheEntryFileExtensionLength));
346 $this->
remove($directoryIterator->getFilename());
362 $pattern = $this->cacheDirectory . $entryIdentifier;
363 $filesFound = glob($pattern);
364 if ($filesFound ===
false || empty($filesFound)) {
379 if ($this->frozen ===
true) {
380 if (isset($this->cacheEntryIdentifiers[$entryIdentifier])) {
386 throw new \InvalidArgumentException(
'The specified entry identifier must not contain a path segment.', 1282073036);
389 return $this->
isCacheFileExpired($pathAndFilename) ? false : require_once $pathAndFilename;
399 public function require(
string $entryIdentifier)
402 if (isset($this->cacheEntryIdentifiers[$entryIdentifier])) {
408 throw new \InvalidArgumentException(
'The specified entry identifier must not contain a path segment.', 1532528246);