fixed race condition when writing template cache on disk (closes #97)

This commit is contained in:
Fabien Potencier
2010-08-12 21:56:30 +02:00
parent c0334a3e8d
commit 8a38a51c1e
+16 -1
View File
@@ -200,7 +200,7 @@ class Twig_Environment
if (!file_exists($cache) || ($this->isAutoReload() && !$this->loader->isFresh($name, filemtime($cache)))) {
$content = $this->compileSource($this->loader->getSource($name), $name);
if (false === file_put_contents($cache, $content, LOCK_EX)) {
if (false === $this->writeCacheFile($cache, $content)) {
eval('?>'.$content);
} else {
require_once $cache;
@@ -403,4 +403,19 @@ class Twig_Environment
return $this->filters;
}
protected function writeCacheFile($file, $content)
{
$tmpFile = tempnam(dirname($file), basename($file));
if (false !== @file_put_contents($tmpFile, $content)) {
// rename does not work on Win32 before 5.2.6
if (@rename($tmpFile, $file) || (@copy($tmpFile, $file) && unlink($tmpFile))) {
chmod($file, 0644);
return;
}
}
throw new RuntimeException(sprintf('Failed to write cache file "%s".', $file));
}
}