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);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |