257 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			257 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | /* | ||
|  |  * This file is part of the Symfony package. | ||
|  |  * | ||
|  |  * (c) Fabien Potencier <fabien@symfony.com> | ||
|  |  * | ||
|  |  * For the full copyright and license information, please view the LICENSE | ||
|  |  * file that was distributed with this source code. | ||
|  |  */ | ||
|  | 
 | ||
|  | namespace Symfony\Component\Cache\Simple; | ||
|  | 
 | ||
|  | use Psr\SimpleCache\CacheInterface as Psr16CacheInterface; | ||
|  | use Symfony\Component\Cache\Adapter\PhpArrayAdapter; | ||
|  | use Symfony\Component\Cache\Exception\InvalidArgumentException; | ||
|  | use Symfony\Component\Cache\PruneableInterface; | ||
|  | use Symfony\Component\Cache\ResettableInterface; | ||
|  | use Symfony\Component\Cache\Traits\PhpArrayTrait; | ||
|  | use Symfony\Contracts\Cache\CacheInterface; | ||
|  | 
 | ||
|  | @trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.3, use "%s" and type-hint for "%s" instead.', PhpArrayCache::class, PhpArrayAdapter::class, CacheInterface::class), \E_USER_DEPRECATED); | ||
|  | 
 | ||
|  | /** | ||
|  |  * @deprecated since Symfony 4.3, use PhpArrayAdapter and type-hint for CacheInterface instead. | ||
|  |  */ | ||
|  | class PhpArrayCache implements Psr16CacheInterface, PruneableInterface, ResettableInterface | ||
|  | { | ||
|  |     use PhpArrayTrait; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @param string              $file         The PHP file were values are cached | ||
|  |      * @param Psr16CacheInterface $fallbackPool A pool to fallback on when an item is not hit | ||
|  |      */ | ||
|  |     public function __construct(string $file, Psr16CacheInterface $fallbackPool) | ||
|  |     { | ||
|  |         $this->file = $file; | ||
|  |         $this->pool = $fallbackPool; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * This adapter takes advantage of how PHP stores arrays in its latest versions. | ||
|  |      * | ||
|  |      * @param string         $file         The PHP file were values are cached | ||
|  |      * @param CacheInterface $fallbackPool A pool to fallback on when an item is not hit | ||
|  |      * | ||
|  |      * @return Psr16CacheInterface | ||
|  |      */ | ||
|  |     public static function create($file, Psr16CacheInterface $fallbackPool) | ||
|  |     { | ||
|  |         return new static($file, $fallbackPool); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      */ | ||
|  |     public function get($key, $default = null) | ||
|  |     { | ||
|  |         if (!\is_string($key)) { | ||
|  |             throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', \is_object($key) ? \get_class($key) : \gettype($key))); | ||
|  |         } | ||
|  |         if (null === $this->values) { | ||
|  |             $this->initialize(); | ||
|  |         } | ||
|  |         if (!isset($this->keys[$key])) { | ||
|  |             return $this->pool->get($key, $default); | ||
|  |         } | ||
|  |         $value = $this->values[$this->keys[$key]]; | ||
|  | 
 | ||
|  |         if ('N;' === $value) { | ||
|  |             return null; | ||
|  |         } | ||
|  |         if ($value instanceof \Closure) { | ||
|  |             try { | ||
|  |                 return $value(); | ||
|  |             } catch (\Throwable $e) { | ||
|  |                 return $default; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         return $value; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      * | ||
|  |      * @return iterable | ||
|  |      */ | ||
|  |     public function getMultiple($keys, $default = null) | ||
|  |     { | ||
|  |         if ($keys instanceof \Traversable) { | ||
|  |             $keys = iterator_to_array($keys, false); | ||
|  |         } elseif (!\is_array($keys)) { | ||
|  |             throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given.', \is_object($keys) ? \get_class($keys) : \gettype($keys))); | ||
|  |         } | ||
|  |         foreach ($keys as $key) { | ||
|  |             if (!\is_string($key)) { | ||
|  |                 throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', \is_object($key) ? \get_class($key) : \gettype($key))); | ||
|  |             } | ||
|  |         } | ||
|  |         if (null === $this->values) { | ||
|  |             $this->initialize(); | ||
|  |         } | ||
|  | 
 | ||
|  |         return $this->generateItems($keys, $default); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      * | ||
|  |      * @return bool | ||
|  |      */ | ||
|  |     public function has($key) | ||
|  |     { | ||
|  |         if (!\is_string($key)) { | ||
|  |             throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', \is_object($key) ? \get_class($key) : \gettype($key))); | ||
|  |         } | ||
|  |         if (null === $this->values) { | ||
|  |             $this->initialize(); | ||
|  |         } | ||
|  | 
 | ||
|  |         return isset($this->keys[$key]) || $this->pool->has($key); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      * | ||
|  |      * @return bool | ||
|  |      */ | ||
|  |     public function delete($key) | ||
|  |     { | ||
|  |         if (!\is_string($key)) { | ||
|  |             throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', \is_object($key) ? \get_class($key) : \gettype($key))); | ||
|  |         } | ||
|  |         if (null === $this->values) { | ||
|  |             $this->initialize(); | ||
|  |         } | ||
|  | 
 | ||
|  |         return !isset($this->keys[$key]) && $this->pool->delete($key); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      * | ||
|  |      * @return bool | ||
|  |      */ | ||
|  |     public function deleteMultiple($keys) | ||
|  |     { | ||
|  |         if (!\is_array($keys) && !$keys instanceof \Traversable) { | ||
|  |             throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given.', \is_object($keys) ? \get_class($keys) : \gettype($keys))); | ||
|  |         } | ||
|  | 
 | ||
|  |         $deleted = true; | ||
|  |         $fallbackKeys = []; | ||
|  | 
 | ||
|  |         foreach ($keys as $key) { | ||
|  |             if (!\is_string($key)) { | ||
|  |                 throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', \is_object($key) ? \get_class($key) : \gettype($key))); | ||
|  |             } | ||
|  | 
 | ||
|  |             if (isset($this->keys[$key])) { | ||
|  |                 $deleted = false; | ||
|  |             } else { | ||
|  |                 $fallbackKeys[] = $key; | ||
|  |             } | ||
|  |         } | ||
|  |         if (null === $this->values) { | ||
|  |             $this->initialize(); | ||
|  |         } | ||
|  | 
 | ||
|  |         if ($fallbackKeys) { | ||
|  |             $deleted = $this->pool->deleteMultiple($fallbackKeys) && $deleted; | ||
|  |         } | ||
|  | 
 | ||
|  |         return $deleted; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      * | ||
|  |      * @return bool | ||
|  |      */ | ||
|  |     public function set($key, $value, $ttl = null) | ||
|  |     { | ||
|  |         if (!\is_string($key)) { | ||
|  |             throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', \is_object($key) ? \get_class($key) : \gettype($key))); | ||
|  |         } | ||
|  |         if (null === $this->values) { | ||
|  |             $this->initialize(); | ||
|  |         } | ||
|  | 
 | ||
|  |         return !isset($this->keys[$key]) && $this->pool->set($key, $value, $ttl); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      * | ||
|  |      * @return bool | ||
|  |      */ | ||
|  |     public function setMultiple($values, $ttl = null) | ||
|  |     { | ||
|  |         if (!\is_array($values) && !$values instanceof \Traversable) { | ||
|  |             throw new InvalidArgumentException(sprintf('Cache values must be array or Traversable, "%s" given.', \is_object($values) ? \get_class($values) : \gettype($values))); | ||
|  |         } | ||
|  | 
 | ||
|  |         $saved = true; | ||
|  |         $fallbackValues = []; | ||
|  | 
 | ||
|  |         foreach ($values as $key => $value) { | ||
|  |             if (!\is_string($key) && !\is_int($key)) { | ||
|  |                 throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', \is_object($key) ? \get_class($key) : \gettype($key))); | ||
|  |             } | ||
|  | 
 | ||
|  |             if (isset($this->keys[$key])) { | ||
|  |                 $saved = false; | ||
|  |             } else { | ||
|  |                 $fallbackValues[$key] = $value; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         if ($fallbackValues) { | ||
|  |             $saved = $this->pool->setMultiple($fallbackValues, $ttl) && $saved; | ||
|  |         } | ||
|  | 
 | ||
|  |         return $saved; | ||
|  |     } | ||
|  | 
 | ||
|  |     private function generateItems(array $keys, $default): iterable | ||
|  |     { | ||
|  |         $fallbackKeys = []; | ||
|  | 
 | ||
|  |         foreach ($keys as $key) { | ||
|  |             if (isset($this->keys[$key])) { | ||
|  |                 $value = $this->values[$this->keys[$key]]; | ||
|  | 
 | ||
|  |                 if ('N;' === $value) { | ||
|  |                     yield $key => null; | ||
|  |                 } elseif ($value instanceof \Closure) { | ||
|  |                     try { | ||
|  |                         yield $key => $value(); | ||
|  |                     } catch (\Throwable $e) { | ||
|  |                         yield $key => $default; | ||
|  |                     } | ||
|  |                 } else { | ||
|  |                     yield $key => $value; | ||
|  |                 } | ||
|  |             } else { | ||
|  |                 $fallbackKeys[] = $key; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         if ($fallbackKeys) { | ||
|  |             yield from $this->pool->getMultiple($fallbackKeys, $default); | ||
|  |         } | ||
|  |     } | ||
|  | } |