Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8605417

Browse files
[Cache] Don't clone, serialize
1 parent 0bacaba commit 8605417

File tree

3 files changed

+27
-24
lines changed

3 files changed

+27
-24
lines changed

src/Symfony/Component/Cache/Adapter/AbstractAdapter.php

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -276,13 +276,6 @@ public function saveDeferred(CacheItemInterface $item)
276276
if (!$item instanceof CacheItem) {
277277
return false;
278278
}
279-
try {
280-
$item = clone $item;
281-
} catch (\Exception $e) {
282-
$value = $item->get();
283-
$type = is_object($value) ? get_class($value) : gettype($value);
284-
CacheItem::log($this->logger, 'Failed to clone key "{key}" ({type})', array('key' => $key, 'type' => $type, 'exception' => $e));
285-
}
286279
$this->deferred[$item->getKey()] = $item;
287280

288281
return true;

src/Symfony/Component/Cache/Adapter/ArrayAdapter.php

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/Symfony/Component/Cache/CacheItem.php

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,6 @@ final class CacheItem implements CacheItemInterface
3131
private $lifetime;
3232
private $defaultLifetime;
3333

34-
public function __clone()
35-
{
36-
if (is_object($this->value)) {
37-
$this->value = clone $this->value;
38-
}
39-
}
40-
4134
/**
4235
* {@inheritdoc}
4336
*/
@@ -112,7 +105,7 @@ public function expiresAfter($time)
112105
*
113106
* @internal
114107
*/
115-
public function log(LoggerInterface $logger = null, $message, $context = array())
108+
public static function log(LoggerInterface $logger = null, $message, $context = array())
116109
{
117110
if ($logger) {
118111
$logger->warning($message, $context);

0 commit comments

Comments
 (0)