2 namespace TYPO3\CMS\Core\Cache\Backend;
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 if ($this->useIgBinary ===
true) {
82 file_put_contents($this->cacheDirectory .
'FrozenCache.data', igbinary_serialize($this->cacheEntryIdentifiers));
84 file_put_contents($this->cacheDirectory .
'FrozenCache.data', serialize($this->cacheEntryIdentifiers));
113 public function setCache(\TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
$cache)
115 parent::setCache($cache);
116 if (file_exists($this->cacheDirectory .
'FrozenCache.data')) {
117 $this->frozen =
true;
118 if ($this->useIgBinary ===
true) {
119 $this->cacheEntryIdentifiers = igbinary_unserialize(file_get_contents($this->cacheDirectory .
'FrozenCache.data'));
121 $this->cacheEntryIdentifiers = unserialize(file_get_contents($this->cacheDirectory .
'FrozenCache.data'));
140 public function set($entryIdentifier, $data, array $tags = array(), $lifetime = null)
142 if (!is_string($data)) {
143 throw new \TYPO3\CMS\Core\Cache\Exception\InvalidDataException(
'The specified data is of type "' . gettype($data) .
'" but a string is expected.', 1204481674);
145 if ($entryIdentifier !== basename($entryIdentifier)) {
146 throw new \InvalidArgumentException(
'The specified entry identifier must not contain a path segment.', 1282073032);
148 if ($entryIdentifier ===
'') {
149 throw new \InvalidArgumentException(
'The specified entry identifier must not be empty.', 1298114280);
151 if ($this->frozen ===
true) {
152 throw new \RuntimeException(sprintf(
'Cannot add or modify cache entry because the backend of cache "%s" is frozen.', $this->cacheIdentifier), 1323344192);
154 $this->
remove($entryIdentifier);
156 $lifetime = $lifetime === null ? $this->defaultLifetime : $lifetime;
157 $expiryTime = $lifetime === 0 ? 0 :
$GLOBALS[
'EXEC_TIME'] + $lifetime;
158 $metaData = str_pad($expiryTime, self::EXPIRYTIME_LENGTH) . implode(
' ', $tags) . str_pad(strlen($data), self::DATASIZE_DIGITS);
159 $result = file_put_contents($temporaryCacheEntryPathAndFilename, $data . $metaData);
160 \TYPO3\CMS\Core\Utility\GeneralUtility::fixPermissions($temporaryCacheEntryPathAndFilename);
161 if ($result ===
false) {
162 throw new \TYPO3\CMS\Core\Cache\Exception(
'The temporary cache file "' . $temporaryCacheEntryPathAndFilename .
'" could not be written.', 1204026251);
166 while (($result = rename($temporaryCacheEntryPathAndFilename, $cacheEntryPathAndFilename)) ===
false && $i < 5) {
169 if ($result ===
false) {
170 throw new \TYPO3\CMS\Core\Cache\Exception(
'The cache file "' . $cacheEntryPathAndFilename .
'" could not be written.', 1222361632);
172 if ($this->cacheEntryFileExtension ===
'.php') {
185 public function get($entryIdentifier)
187 if ($this->frozen ===
true) {
188 return isset($this->cacheEntryIdentifiers[$entryIdentifier]) ? file_get_contents($this->cacheDirectory . $entryIdentifier . $this->cacheEntryFileExtension) :
false;
190 if ($entryIdentifier !== basename($entryIdentifier)) {
191 throw new \InvalidArgumentException(
'The specified entry identifier must not contain a path segment.', 1282073033);
197 $dataSize = (int)file_get_contents($pathAndFilename, null, null, (filesize($pathAndFilename) - self::DATASIZE_DIGITS), self::DATASIZE_DIGITS);
198 return file_get_contents($pathAndFilename, null, null, 0, $dataSize);
209 public function has($entryIdentifier)
211 if ($this->frozen ===
true) {
212 return isset($this->cacheEntryIdentifiers[$entryIdentifier]);
214 if ($entryIdentifier !== basename($entryIdentifier)) {
215 throw new \InvalidArgumentException(
'The specified entry identifier must not contain a path segment.', 1282073034);
217 return !$this->
isCacheFileExpired(($this->cacheDirectory . $entryIdentifier . $this->cacheEntryFileExtension));
230 public function remove($entryIdentifier)
232 if ($entryIdentifier !== basename($entryIdentifier)) {
233 throw new \InvalidArgumentException(
'The specified entry identifier must not contain a path segment.', 1282073035);
235 if ($entryIdentifier ===
'') {
236 throw new \InvalidArgumentException(
'The specified entry identifier must not be empty.', 1298114279);
238 if ($this->frozen ===
true) {
239 throw new \RuntimeException(sprintf(
'Cannot remove cache entry because the backend of cache "%s" is frozen.', $this->cacheIdentifier), 1323344193);
242 if (file_exists($pathAndFilename) ===
false) {
245 if (@unlink($pathAndFilename) ===
false) {
261 $entryIdentifiers = array();
263 $cacheEntryFileExtensionLength = strlen($this->cacheEntryFileExtension);
264 for ($directoryIterator = \TYPO3\CMS\Core\Utility\
GeneralUtility::makeInstance(\DirectoryIterator::class, $this->cacheDirectory); $directoryIterator->valid(); $directoryIterator->next()) {
265 if ($directoryIterator->isDot()) {
268 $cacheEntryPathAndFilename = $directoryIterator->getPathname();
269 $index = (int)file_get_contents($cacheEntryPathAndFilename, null, null, (filesize($cacheEntryPathAndFilename) - self::DATASIZE_DIGITS), self::DATASIZE_DIGITS);
270 $metaData = file_get_contents($cacheEntryPathAndFilename, null, null, $index);
271 $expiryTime = (int)substr($metaData, 0, self::EXPIRYTIME_LENGTH);
272 if ($expiryTime !== 0 && $expiryTime < $now) {
275 if (in_array($searchedTag, explode(
' ', substr($metaData, self::EXPIRYTIME_LENGTH, -self::DATASIZE_DIGITS)))) {
276 if ($cacheEntryFileExtensionLength > 0) {
277 $entryIdentifiers[] = substr($directoryIterator->getFilename(), 0, -$cacheEntryFileExtensionLength);
279 $entryIdentifiers[] = $directoryIterator->getFilename();
283 return $entryIdentifiers;
295 if ($this->frozen ===
true) {
296 $this->frozen =
false;
310 if (empty($identifiers)) {
313 foreach ($identifiers as $entryIdentifier) {
314 $this->
remove($entryIdentifier);
328 if (file_exists($cacheEntryPathAndFilename) ===
false) {
331 $index = (int)file_get_contents($cacheEntryPathAndFilename, null, null, (filesize($cacheEntryPathAndFilename) - self::DATASIZE_DIGITS), self::DATASIZE_DIGITS);
332 $expiryTime = (int)file_get_contents($cacheEntryPathAndFilename, null, null, $index, self::EXPIRYTIME_LENGTH);
333 return $expiryTime !== 0 && $expiryTime <
$GLOBALS[
'EXEC_TIME'];
344 if ($this->frozen ===
true) {
347 for ($directoryIterator =
new \DirectoryIterator($this->cacheDirectory); $directoryIterator->valid(); $directoryIterator->next()) {
348 if ($directoryIterator->isDot()) {
352 $cacheEntryFileExtensionLength = strlen($this->cacheEntryFileExtension);
353 if ($cacheEntryFileExtensionLength > 0) {
354 $this->
remove(substr($directoryIterator->getFilename(), 0, -$cacheEntryFileExtensionLength));
356 $this->
remove($directoryIterator->getFilename());
372 $pattern = $this->cacheDirectory . $entryIdentifier;
373 $filesFound = glob($pattern);
374 if ($filesFound ===
false || empty($filesFound)) {
390 if ($this->frozen ===
true) {
391 if (isset($this->cacheEntryIdentifiers[$entryIdentifier])) {
398 if ($entryIdentifier !== basename($entryIdentifier)) {
399 throw new \InvalidArgumentException(
'The specified entry identifier must not contain a path segment.', 1282073036);
402 return $this->
isCacheFileExpired($pathAndFilename) ?
false : require_once $pathAndFilename;