@@ -25,12 +25,18 @@ class ArrayAdapter implements CacheItemPoolInterface, LoggerAwareInterface
2525{
2626 use LoggerAwareTrait;
2727
28+ private $ storeSerialized ;
2829 private $ values = array ();
2930 private $ expiries = array ();
3031 private $ createCacheItem ;
3132
32- public function __construct ($ defaultLifetime = 0 )
33+ /**
34+ * @param int $defaultLifetime
35+ * @param bool $storeSerialized Disabling serialization can lead to cache corruptions when storing mutable values but increases performance otherwise.
36+ */
37+ public function __construct ($ defaultLifetime = 0 , $ storeSerialized = true )
3338 {
39+ $ this ->storeSerialized = $ storeSerialized ;
3440 $ this ->createCacheItem = \Closure::bind (
3541 function ($ key , $ value , $ isHit ) use ($ defaultLifetime ) {
3642 $ item = new CacheItem ();
@@ -51,10 +57,16 @@ function ($key, $value, $isHit) use ($defaultLifetime) {
5157 */
5258 public function getItem ($ key )
5359 {
60+ if (!$ isHit = $ this ->hasItem ($ key )) {
61+ $ value = null ;
62+ } elseif ($ this ->storeSerialized ) {
63+ $ value = unserialize ($ this ->values [$ key ]);
64+ } else {
65+ $ value = $ this ->values [$ key ];
66+ }
5467 $ f = $ this ->createCacheItem ;
55- $ isHit = $ this ->hasItem ($ key );
5668
57- return $ f ($ key , $ isHit ? $ this -> values [ $ key ] : null , $ isHit );
69+ return $ f ($ key , $ value , $ isHit );
5870 }
5971
6072 /**
@@ -125,13 +137,12 @@ public function save(CacheItemInterface $item)
125137 if (0 > $ lifetime ) {
126138 return true ;
127139 }
128-
129- if (is_object ($ value )) {
140+ if ($ this ->storeSerialized ) {
130141 try {
131- $ value = clone $ value ;
142+ $ value = serialize ( $ value) ;
132143 } catch (\Exception $ e ) {
133144 $ type = is_object ($ value ) ? get_class ($ value ) : gettype ($ value );
134- CacheItem::log ($ this ->logger , 'Failed to clone key "{key}" ({type}) ' , array ('key ' => $ key , 'type ' => $ type , 'exception ' => $ e ));
145+ CacheItem::log ($ this ->logger , 'Failed to save key "{key}" ({type}) ' , array ('key ' => $ key , 'type ' => $ type , 'exception ' => $ e ));
135146
136147 return false ;
137148 }
@@ -179,9 +190,15 @@ private function generateItems(array $keys)
179190 $ f = $ this ->createCacheItem ;
180191
181192 foreach ($ keys as $ key ) {
182- $ isHit = isset ($ this ->expiries [$ key ]) && ($ this ->expiries [$ key ] >= time () || !$ this ->deleteItem ($ key ));
193+ if (!$ isHit = isset ($ this ->expiries [$ key ]) && ($ this ->expiries [$ key ] >= time () || !$ this ->deleteItem ($ key ))) {
194+ $ value = null ;
195+ } elseif ($ this ->storeSerialized ) {
196+ $ value = unserialize ($ this ->values [$ key ]);
197+ } else {
198+ $ value = $ this ->values [$ key ];
199+ }
183200
184- yield $ key => $ f ($ key , $ isHit ? $ this -> values [ $ key ] : null , $ isHit );
201+ yield $ key => $ f ($ key , $ value , $ isHit );
185202 }
186203 }
187204}
0 commit comments