[Cache] fix memory leak when using PhpArrayAdapter
This commit is contained in:
parent
59126e0f9c
commit
4194c4c56d
@ -61,14 +61,13 @@ class PhpArrayAdapter implements AdapterInterface, PruneableInterface, Resettabl
|
||||
* fallback pool with this adapter only if the current PHP version is supported.
|
||||
*
|
||||
* @param string $file The PHP file were values are cached
|
||||
* @param CacheItemPoolInterface $fallbackPool Fallback for old PHP versions or opcache disabled
|
||||
* @param CacheItemPoolInterface $fallbackPool A pool to fallback on when an item is not hit
|
||||
*
|
||||
* @return CacheItemPoolInterface
|
||||
*/
|
||||
public static function create($file, CacheItemPoolInterface $fallbackPool)
|
||||
{
|
||||
// Shared memory is available in PHP 7.0+ with OPCache enabled and in HHVM
|
||||
if ((\PHP_VERSION_ID >= 70000 && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN)) || \defined('HHVM_VERSION')) {
|
||||
if (\PHP_VERSION_ID >= 70000) {
|
||||
if (!$fallbackPool instanceof AdapterInterface) {
|
||||
$fallbackPool = new ProxyAdapter($fallbackPool);
|
||||
}
|
||||
|
@ -45,13 +45,13 @@ class PhpArrayCache implements CacheInterface, PruneableInterface, ResettableInt
|
||||
* fallback pool with this adapter only if the current PHP version is supported.
|
||||
*
|
||||
* @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 CacheInterface
|
||||
*/
|
||||
public static function create($file, CacheInterface $fallbackPool)
|
||||
{
|
||||
// Shared memory is available in PHP 7.0+ with OPCache enabled and in HHVM
|
||||
if ((\PHP_VERSION_ID >= 70000 && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN)) || \defined('HHVM_VERSION')) {
|
||||
if (\PHP_VERSION_ID >= 70000) {
|
||||
return new static($file, $fallbackPool);
|
||||
}
|
||||
|
||||
|
@ -62,6 +62,8 @@ class PhpArrayAdapterTest extends AdapterTestCase
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
$this->createCachePool()->clear();
|
||||
|
||||
if (file_exists(sys_get_temp_dir().'/symfony-cache')) {
|
||||
FilesystemAdapterTest::rmdir(sys_get_temp_dir().'/symfony-cache');
|
||||
}
|
||||
|
@ -37,6 +37,8 @@ class PhpArrayAdapterWithFallbackTest extends AdapterTestCase
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
$this->createCachePool()->clear();
|
||||
|
||||
if (file_exists(sys_get_temp_dir().'/symfony-cache')) {
|
||||
FilesystemAdapterTest::rmdir(sys_get_temp_dir().'/symfony-cache');
|
||||
}
|
||||
|
@ -56,6 +56,8 @@ class PhpArrayCacheTest extends CacheTestCase
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
$this->createSimpleCache()->clear();
|
||||
|
||||
if (file_exists(sys_get_temp_dir().'/symfony-cache')) {
|
||||
FilesystemAdapterTest::rmdir(sys_get_temp_dir().'/symfony-cache');
|
||||
}
|
||||
|
@ -43,6 +43,8 @@ class PhpArrayCacheWithFallbackTest extends CacheTestCase
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
$this->createSimpleCache()->clear();
|
||||
|
||||
if (file_exists(sys_get_temp_dir().'/symfony-cache')) {
|
||||
FilesystemAdapterTest::rmdir(sys_get_temp_dir().'/symfony-cache');
|
||||
}
|
||||
|
@ -28,6 +28,8 @@ trait PhpArrayTrait
|
||||
private $values;
|
||||
private $zendDetectUnicode;
|
||||
|
||||
private static $valuesCache = [];
|
||||
|
||||
/**
|
||||
* Store an array of cached values.
|
||||
*
|
||||
@ -107,6 +109,7 @@ EOF;
|
||||
unset($serialized, $unserialized, $value, $dump);
|
||||
|
||||
@rename($tmpFile, $this->file);
|
||||
unset(self::$valuesCache[$this->file]);
|
||||
|
||||
$this->initialize();
|
||||
}
|
||||
@ -119,6 +122,7 @@ EOF;
|
||||
$this->values = [];
|
||||
|
||||
$cleared = @unlink($this->file) || !file_exists($this->file);
|
||||
unset(self::$valuesCache[$this->file]);
|
||||
|
||||
return $this->pool->clear() && $cleared;
|
||||
}
|
||||
@ -128,11 +132,17 @@ EOF;
|
||||
*/
|
||||
private function initialize()
|
||||
{
|
||||
if (isset(self::$valuesCache[$this->file])) {
|
||||
$this->values = self::$valuesCache[$this->file];
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->zendDetectUnicode) {
|
||||
$zmb = ini_set('zend.detect_unicode', 0);
|
||||
}
|
||||
try {
|
||||
$this->values = file_exists($this->file) ? (include $this->file ?: []) : [];
|
||||
$this->values = self::$valuesCache[$this->file] = file_exists($this->file) ? (include $this->file ?: []) : [];
|
||||
} finally {
|
||||
if ($this->zendDetectUnicode) {
|
||||
ini_set('zend.detect_unicode', $zmb);
|
||||
|
Reference in New Issue
Block a user