diff --git a/src/DependencyInjection/Configurator.php b/src/DependencyInjection/Configurator.php index 1c918448ab..9eaf3fb909 100644 --- a/src/DependencyInjection/Configurator.php +++ b/src/DependencyInjection/Configurator.php @@ -15,6 +15,9 @@ use function count; use function error_reporting; use function explode; +use function fclose; +use function flock; +use function fopen; use function implode; use function in_array; use function is_dir; @@ -29,6 +32,8 @@ use function trim; use function unlink; use const E_USER_DEPRECATED; +use const LOCK_EX; +use const LOCK_UN; use const PHP_RELEASE_VERSION; use const PHP_VERSION_ID; @@ -74,6 +79,15 @@ public function getContainerCacheDirectory(): string #[Override] public function loadContainer(): string { + $directory = $this->getContainerCacheDirectory(); + $locked = false; + if ($this->journalContainer && is_dir($directory)) { + $lockFile = $directory . '/container.lock'; + $handle = fopen($lockFile, 'c'); // @ is escalated to exception + flock($handle, LOCK_EX); + $locked = true; + } + $loader = new ContainerLoader( $this->getContainerCacheDirectory(), $this->staticParameters['debugMode'], @@ -95,6 +109,10 @@ public function loadContainer(): string if ($this->journalContainer) { $this->journal($className); + if ($locked) { + flock($handle, LOCK_UN); + fclose($handle); + } } return $className; @@ -173,7 +191,7 @@ private function journal(string $currentContainerClassName): void continue; } $fileName = $fileInfo->getFilename(); - if ($fileName === 'container.journal') { + if ($fileName === 'container.journal' || $fileName === 'container.lock') { continue; } if (!str_ends_with($fileName, '.php')) {