X-Git-Url: https://yaffs.net/gitweb/?a=blobdiff_plain;f=vendor%2Fsymfony%2Fconfig%2FResourceCheckerConfigCache.php;h=91feed6228329fccf3bfe538aec307e732d36c3d;hb=5b8bb166bfa98770daef9de5c127fc2e6ef02340;hp=0e3a411b07552e45fe33306abe6e37d504627bc3;hpb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;p=yaffs-website diff --git a/vendor/symfony/config/ResourceCheckerConfigCache.php b/vendor/symfony/config/ResourceCheckerConfigCache.php index 0e3a411b0..91feed622 100644 --- a/vendor/symfony/config/ResourceCheckerConfigCache.php +++ b/vendor/symfony/config/ResourceCheckerConfigCache.php @@ -29,15 +29,15 @@ class ResourceCheckerConfigCache implements ConfigCacheInterface private $file; /** - * @var ResourceCheckerInterface[] + * @var iterable|ResourceCheckerInterface[] */ private $resourceCheckers; /** - * @param string $file The absolute cache path - * @param ResourceCheckerInterface[] $resourceCheckers The ResourceCheckers to use for the freshness check + * @param string $file The absolute cache path + * @param iterable|ResourceCheckerInterface[] $resourceCheckers The ResourceCheckers to use for the freshness check */ - public function __construct($file, array $resourceCheckers = array()) + public function __construct($file, $resourceCheckers = array()) { $this->file = $file; $this->resourceCheckers = $resourceCheckers; @@ -68,42 +68,28 @@ class ResourceCheckerConfigCache implements ConfigCacheInterface return false; } - if (!$this->resourceCheckers) { + if ($this->resourceCheckers instanceof \Traversable && !$this->resourceCheckers instanceof \Countable) { + $this->resourceCheckers = iterator_to_array($this->resourceCheckers); + } + + if (!\count($this->resourceCheckers)) { return true; // shortcut - if we don't have any checkers we don't need to bother with the meta file at all } $metadata = $this->getMetaFile(); + if (!is_file($metadata)) { return false; } - $e = null; - $meta = false; - $time = filemtime($this->file); - $signalingException = new \UnexpectedValueException(); - $prevUnserializeHandler = ini_set('unserialize_callback_func', ''); - $prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context) use (&$prevErrorHandler, $signalingException) { - if (E_WARNING === $type && 'Class __PHP_Incomplete_Class has no unserializer' === $msg) { - throw $signalingException; - } - - return $prevErrorHandler ? $prevErrorHandler($type, $msg, $file, $line, $context) : false; - }); + $meta = $this->safelyUnserialize($metadata); - try { - $meta = unserialize(file_get_contents($metadata)); - } catch (\Error $e) { - } catch (\Exception $e) { - } - restore_error_handler(); - ini_set('unserialize_callback_func', $prevUnserializeHandler); - if (null !== $e && $e !== $signalingException) { - throw $e; - } if (false === $meta) { return false; } + $time = filemtime($this->file); + foreach ($meta as $resource) { /* @var ResourceInterface $resource */ foreach ($this->resourceCheckers as $checker) { @@ -135,7 +121,7 @@ class ResourceCheckerConfigCache implements ConfigCacheInterface $mode = 0666; $umask = umask(); $filesystem = new Filesystem(); - $filesystem->dumpFile($this->file, $content, null); + $filesystem->dumpFile($this->file, $content); try { $filesystem->chmod($this->file, $mode, $umask); } catch (IOException $e) { @@ -143,13 +129,17 @@ class ResourceCheckerConfigCache implements ConfigCacheInterface } if (null !== $metadata) { - $filesystem->dumpFile($this->getMetaFile(), serialize($metadata), null); + $filesystem->dumpFile($this->getMetaFile(), serialize($metadata)); try { $filesystem->chmod($this->getMetaFile(), $mode, $umask); } catch (IOException $e) { // discard chmod failure (some filesystem may not support it) } } + + if (\function_exists('opcache_invalidate') && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN)) { + @opcache_invalidate($this->file, true); + } } /** @@ -161,4 +151,32 @@ class ResourceCheckerConfigCache implements ConfigCacheInterface { return $this->file.'.meta'; } + + private function safelyUnserialize($file) + { + $e = null; + $meta = false; + $signalingException = new \UnexpectedValueException(); + $prevUnserializeHandler = ini_set('unserialize_callback_func', ''); + $prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = array()) use (&$prevErrorHandler, $signalingException) { + if (E_WARNING === $type && 'Class __PHP_Incomplete_Class has no unserializer' === $msg) { + throw $signalingException; + } + + return $prevErrorHandler ? $prevErrorHandler($type, $msg, $file, $line, $context) : false; + }); + + try { + $meta = unserialize(file_get_contents($file)); + } catch (\Error $e) { + } catch (\Exception $e) { + } + restore_error_handler(); + ini_set('unserialize_callback_func', $prevUnserializeHandler); + if (null !== $e && $e !== $signalingException) { + throw $e; + } + + return $meta; + } }