From 53b1ee52a2b5b21e9caa060dda06671974cd4bf8 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sun, 8 May 2016 00:04:41 +0200 Subject: [PATCH] [Cache] Lock-less FilesystemAdapter --- .../Component/Cache/Adapter/FilesystemAdapter.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Component/Cache/Adapter/FilesystemAdapter.php b/src/Symfony/Component/Cache/Adapter/FilesystemAdapter.php index 874dec0b87..45938d0a59 100644 --- a/src/Symfony/Component/Cache/Adapter/FilesystemAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/FilesystemAdapter.php @@ -63,9 +63,7 @@ class FilesystemAdapter extends AbstractAdapter if (!$h = @fopen($file, 'rb')) { continue; } - flock($h, LOCK_SH); if ($now >= (int) $expiresAt = fgets($h)) { - flock($h, LOCK_UN); fclose($h); if (isset($expiresAt[0])) { @unlink($file); @@ -73,7 +71,6 @@ class FilesystemAdapter extends AbstractAdapter } else { $i = rawurldecode(rtrim(fgets($h))); $value = stream_get_contents($h); - flock($h, LOCK_UN); fclose($h); if ($i === $id) { $values[$id] = unserialize($value); @@ -130,6 +127,7 @@ class FilesystemAdapter extends AbstractAdapter { $ok = true; $expiresAt = $lifetime ? time() + $lifetime : PHP_INT_MAX; + $tmp = $this->directory.uniqid('', true); foreach ($values as $id => $value) { $file = $this->getFile($id); @@ -138,8 +136,9 @@ class FilesystemAdapter extends AbstractAdapter @mkdir($dir, 0777, true); } $value = $expiresAt."\n".rawurlencode($id)."\n".serialize($value); - if (false !== @file_put_contents($file, $value, LOCK_EX)) { - @touch($file, $expiresAt); + if (false !== @file_put_contents($tmp, $value)) { + @touch($tmp, $expiresAt); + $ok = @rename($tmp, $file) && $ok; } else { $ok = false; }