2018-04-17 04:11:51 +02:00
< ? 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\Log\LoggerAwareInterface ;
2024-03-20 03:35:09 +01:00
use Psr\SimpleCache\CacheInterface as Psr16CacheInterface ;
use Symfony\Component\Cache\Adapter\ArrayAdapter ;
2018-04-17 04:11:51 +02:00
use Symfony\Component\Cache\CacheItem ;
use Symfony\Component\Cache\Exception\InvalidArgumentException ;
use Symfony\Component\Cache\ResettableInterface ;
use Symfony\Component\Cache\Traits\ArrayTrait ;
2024-03-20 03:35:09 +01:00
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.' , ArrayCache :: class , ArrayAdapter :: class , CacheInterface :: class ), \E_USER_DEPRECATED );
2018-04-17 04:11:51 +02:00
/**
2024-03-20 03:35:09 +01:00
* @ deprecated since Symfony 4.3 , use ArrayAdapter and type - hint for CacheInterface instead .
2018-04-17 04:11:51 +02:00
*/
2024-03-20 03:35:09 +01:00
class ArrayCache implements Psr16CacheInterface , LoggerAwareInterface , ResettableInterface
2018-04-17 04:11:51 +02:00
{
use ArrayTrait {
ArrayTrait :: deleteItem as delete ;
ArrayTrait :: hasItem as has ;
}
private $defaultLifetime ;
/**
* @ param bool $storeSerialized Disabling serialization can lead to cache corruptions when storing mutable values but increases performance otherwise
*/
2024-03-20 03:35:09 +01:00
public function __construct ( int $defaultLifetime = 0 , bool $storeSerialized = true )
2018-04-17 04:11:51 +02:00
{
2024-03-20 03:35:09 +01:00
$this -> defaultLifetime = $defaultLifetime ;
2018-04-17 04:11:51 +02:00
$this -> storeSerialized = $storeSerialized ;
}
/**
* { @ inheritdoc }
*/
public function get ( $key , $default = null )
{
2024-03-20 03:35:09 +01:00
if ( ! \is_string ( $key ) || ! isset ( $this -> expiries [ $key ])) {
CacheItem :: validateKey ( $key );
}
if ( ! $isHit = isset ( $this -> expiries [ $key ]) && ( $this -> expiries [ $key ] > microtime ( true ) || ! $this -> delete ( $key ))) {
$this -> values [ $key ] = null ;
return $default ;
2018-04-17 04:11:51 +02:00
}
2024-03-20 03:35:09 +01:00
if ( ! $this -> storeSerialized ) {
return $this -> values [ $key ];
}
$value = $this -> unfreeze ( $key , $isHit );
return $isHit ? $value : $default ;
2018-04-17 04:11:51 +02:00
}
/**
* { @ inheritdoc }
2024-03-20 03:35:09 +01:00
*
* @ return iterable
2018-04-17 04:11:51 +02:00
*/
public function getMultiple ( $keys , $default = null )
{
if ( $keys instanceof \Traversable ) {
$keys = iterator_to_array ( $keys , false );
2024-01-12 06:08:24 +01:00
} 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 )));
2018-04-17 04:11:51 +02:00
}
foreach ( $keys as $key ) {
2024-03-20 03:35:09 +01:00
if ( ! \is_string ( $key ) || ! isset ( $this -> expiries [ $key ])) {
CacheItem :: validateKey ( $key );
}
2018-04-17 04:11:51 +02:00
}
2024-03-20 03:35:09 +01:00
return $this -> generateItems ( $keys , microtime ( true ), function ( $k , $v , $hit ) use ( $default ) { return $hit ? $v : $default ; });
2018-04-17 04:11:51 +02:00
}
/**
* { @ inheritdoc }
2024-03-20 03:35:09 +01:00
*
* @ return bool
2018-04-17 04:11:51 +02:00
*/
public function deleteMultiple ( $keys )
{
2024-01-12 06:08:24 +01:00
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 )));
2018-04-17 04:11:51 +02:00
}
foreach ( $keys as $key ) {
$this -> delete ( $key );
}
return true ;
}
/**
* { @ inheritdoc }
2024-03-20 03:35:09 +01:00
*
* @ return bool
2018-04-17 04:11:51 +02:00
*/
public function set ( $key , $value , $ttl = null )
{
2024-03-20 03:35:09 +01:00
if ( ! \is_string ( $key )) {
CacheItem :: validateKey ( $key );
}
2018-04-17 04:11:51 +02:00
2024-01-12 06:08:24 +01:00
return $this -> setMultiple ([ $key => $value ], $ttl );
2018-04-17 04:11:51 +02:00
}
/**
* { @ inheritdoc }
2024-03-20 03:35:09 +01:00
*
* @ return bool
2018-04-17 04:11:51 +02:00
*/
public function setMultiple ( $values , $ttl = null )
{
2024-01-12 06:08:24 +01:00
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 )));
2018-04-17 04:11:51 +02:00
}
2024-01-12 06:08:24 +01:00
$valuesArray = [];
2018-04-17 04:11:51 +02:00
foreach ( $values as $key => $value ) {
2024-03-20 03:35:09 +01:00
if ( ! \is_int ( $key ) && ! ( \is_string ( $key ) && isset ( $this -> expiries [ $key ]))) {
CacheItem :: validateKey ( $key );
}
2018-04-17 04:11:51 +02:00
$valuesArray [ $key ] = $value ;
}
if ( false === $ttl = $this -> normalizeTtl ( $ttl )) {
return $this -> deleteMultiple ( array_keys ( $valuesArray ));
}
2024-03-20 03:35:09 +01:00
$expiry = 0 < $ttl ? microtime ( true ) + $ttl : \PHP_INT_MAX ;
2018-04-17 04:11:51 +02:00
foreach ( $valuesArray as $key => $value ) {
2024-03-20 03:35:09 +01:00
if ( $this -> storeSerialized && null === $value = $this -> freeze ( $value , $key )) {
return false ;
}
2018-04-17 04:11:51 +02:00
$this -> values [ $key ] = $value ;
$this -> expiries [ $key ] = $expiry ;
}
return true ;
}
private function normalizeTtl ( $ttl )
{
if ( null === $ttl ) {
return $this -> defaultLifetime ;
}
if ( $ttl instanceof \DateInterval ) {
$ttl = ( int ) \DateTime :: createFromFormat ( 'U' , 0 ) -> add ( $ttl ) -> format ( 'U' );
}
2024-01-12 06:08:24 +01:00
if ( \is_int ( $ttl )) {
2018-04-17 04:11:51 +02:00
return 0 < $ttl ? $ttl : false ;
}
2024-01-12 06:08:24 +01:00
throw new InvalidArgumentException ( sprintf ( 'Expiration date must be an integer, a DateInterval or null, "%s" given.' , \is_object ( $ttl ) ? \get_class ( $ttl ) : \gettype ( $ttl )));
2018-04-17 04:11:51 +02:00
}
}