mirror of
https://github.com/twigphp/Twig.git
synced 2026-11-11 04:36:47 +00:00
349a5f26c3
This fix makes twig gracefully fail on opcache API being disabled on shared hosting platforms for security reasons. Tested with Grav CMS.
94 lines
2.5 KiB
PHP
94 lines
2.5 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of Twig.
|
|
*
|
|
* (c) Fabien Potencier
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Twig\Cache;
|
|
|
|
/**
|
|
* Implements a cache on the filesystem.
|
|
*
|
|
* @author Andrew Tch <andrew@noop.lv>
|
|
*/
|
|
class FilesystemCache implements CacheInterface
|
|
{
|
|
const FORCE_BYTECODE_INVALIDATION = 1;
|
|
|
|
private $directory;
|
|
private $options;
|
|
|
|
/**
|
|
* @param string $directory The root cache directory
|
|
* @param int $options A set of options
|
|
*/
|
|
public function __construct($directory, $options = 0)
|
|
{
|
|
$this->directory = rtrim($directory, '\/').'/';
|
|
$this->options = $options;
|
|
}
|
|
|
|
public function generateKey($name, $className)
|
|
{
|
|
$hash = hash('sha256', $className);
|
|
|
|
return $this->directory.$hash[0].$hash[1].'/'.$hash.'.php';
|
|
}
|
|
|
|
public function load($key)
|
|
{
|
|
if (file_exists($key)) {
|
|
@include_once $key;
|
|
}
|
|
}
|
|
|
|
public function write($key, $content)
|
|
{
|
|
$dir = \dirname($key);
|
|
if (!is_dir($dir)) {
|
|
if (false === @mkdir($dir, 0777, true)) {
|
|
clearstatcache(true, $dir);
|
|
if (!is_dir($dir)) {
|
|
throw new \RuntimeException(sprintf('Unable to create the cache directory (%s).', $dir));
|
|
}
|
|
}
|
|
} elseif (!is_writable($dir)) {
|
|
throw new \RuntimeException(sprintf('Unable to write in the cache directory (%s).', $dir));
|
|
}
|
|
|
|
$tmpFile = tempnam($dir, basename($key));
|
|
if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $key)) {
|
|
@chmod($key, 0666 & ~umask());
|
|
|
|
if (self::FORCE_BYTECODE_INVALIDATION == ($this->options & self::FORCE_BYTECODE_INVALIDATION)) {
|
|
// Compile cached file into bytecode cache
|
|
if (\function_exists('opcache_invalidate') && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN)) {
|
|
@opcache_invalidate($key, true);
|
|
} elseif (\function_exists('apc_compile_file')) {
|
|
apc_compile_file($key);
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
throw new \RuntimeException(sprintf('Failed to write cache file "%s".', $key));
|
|
}
|
|
|
|
public function getTimestamp($key)
|
|
{
|
|
if (!file_exists($key)) {
|
|
return 0;
|
|
}
|
|
|
|
return (int) @filemtime($key);
|
|
}
|
|
}
|
|
|
|
class_alias('Twig\Cache\FilesystemCache', 'Twig_Cache_Filesystem');
|