file_cache_준비
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of the Nette Framework (https://nette.org)
|
||||
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Nette\Bridges\CacheDI;
|
||||
|
||||
use Nette;
|
||||
|
||||
|
||||
/**
|
||||
* Cache extension for Nette DI.
|
||||
*/
|
||||
final class CacheExtension extends Nette\DI\CompilerExtension
|
||||
{
|
||||
/** @var string */
|
||||
private $tempDir;
|
||||
|
||||
|
||||
public function __construct(string $tempDir)
|
||||
{
|
||||
$this->tempDir = $tempDir;
|
||||
}
|
||||
|
||||
|
||||
public function loadConfiguration()
|
||||
{
|
||||
$dir = $this->tempDir . '/cache';
|
||||
Nette\Utils\FileSystem::createDir($dir);
|
||||
if (!is_writable($dir)) {
|
||||
throw new Nette\InvalidStateException("Make directory '$dir' writable.");
|
||||
}
|
||||
|
||||
$builder = $this->getContainerBuilder();
|
||||
|
||||
if (extension_loaded('pdo_sqlite')) {
|
||||
$builder->addDefinition($this->prefix('journal'))
|
||||
->setType(Nette\Caching\Storages\IJournal::class)
|
||||
->setFactory(Nette\Caching\Storages\SQLiteJournal::class, [$dir . '/journal.s3db']);
|
||||
}
|
||||
|
||||
$builder->addDefinition($this->prefix('storage'))
|
||||
->setType(Nette\Caching\IStorage::class)
|
||||
->setFactory(Nette\Caching\Storages\FileStorage::class, [$dir]);
|
||||
|
||||
if ($this->name === 'cache') {
|
||||
if (extension_loaded('pdo_sqlite')) {
|
||||
$builder->addAlias('nette.cacheJournal', $this->prefix('journal'));
|
||||
}
|
||||
$builder->addAlias('cacheStorage', $this->prefix('storage'));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of the Nette Framework (https://nette.org)
|
||||
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Nette\Bridges\CacheLatte;
|
||||
|
||||
use Latte;
|
||||
use Nette;
|
||||
use Nette\Caching\Cache;
|
||||
|
||||
|
||||
/**
|
||||
* Macro {cache} ... {/cache}
|
||||
*/
|
||||
final class CacheMacro implements Latte\IMacro
|
||||
{
|
||||
use Nette\SmartObject;
|
||||
|
||||
/** @var bool */
|
||||
private $used;
|
||||
|
||||
|
||||
/**
|
||||
* Initializes before template parsing.
|
||||
* @return void
|
||||
*/
|
||||
public function initialize()
|
||||
{
|
||||
$this->used = false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Finishes template parsing.
|
||||
* @return array(prolog, epilog)
|
||||
*/
|
||||
public function finalize()
|
||||
{
|
||||
if ($this->used) {
|
||||
return ['Nette\Bridges\CacheLatte\CacheMacro::initRuntime($this);'];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* New node is found.
|
||||
* @return bool
|
||||
*/
|
||||
public function nodeOpened(Latte\MacroNode $node)
|
||||
{
|
||||
if ($node->modifiers) {
|
||||
throw new Latte\CompileException('Modifiers are not allowed in ' . $node->getNotation());
|
||||
}
|
||||
$this->used = true;
|
||||
$node->empty = false;
|
||||
$node->openingCode = Latte\PhpWriter::using($node)
|
||||
->write('<?php if (Nette\Bridges\CacheLatte\CacheMacro::createCache($this->global->cacheStorage, %var, $this->global->cacheStack, %node.array?)) { ?>',
|
||||
Nette\Utils\Random::generate()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Node is closed.
|
||||
* @return void
|
||||
*/
|
||||
public function nodeClosed(Latte\MacroNode $node)
|
||||
{
|
||||
$node->closingCode = Latte\PhpWriter::using($node)
|
||||
->write('<?php Nette\Bridges\CacheLatte\CacheMacro::endCache($this->global->cacheStack, %node.array?); } ?>');
|
||||
}
|
||||
|
||||
|
||||
/********************* run-time helpers ****************d*g**/
|
||||
|
||||
|
||||
public static function initRuntime(Latte\Runtime\Template $template): void
|
||||
{
|
||||
if (!empty($template->global->cacheStack)) {
|
||||
$file = (new \ReflectionClass($template))->getFileName();
|
||||
if (@is_file($file)) { // @ - may trigger error
|
||||
end($template->global->cacheStack)->dependencies[Cache::FILES][] = $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Starts the output cache. Returns Nette\Caching\OutputHelper object if buffering was started.
|
||||
* @return Nette\Caching\OutputHelper|\stdClass
|
||||
*/
|
||||
public static function createCache(Nette\Caching\IStorage $cacheStorage, string $key, ?array &$parents, array $args = null)
|
||||
{
|
||||
if ($args) {
|
||||
if (array_key_exists('if', $args) && !$args['if']) {
|
||||
return $parents[] = new \stdClass;
|
||||
}
|
||||
$key = array_merge([$key], array_intersect_key($args, range(0, count($args))));
|
||||
}
|
||||
if ($parents) {
|
||||
end($parents)->dependencies[Cache::ITEMS][] = $key;
|
||||
}
|
||||
|
||||
$cache = new Cache($cacheStorage, 'Nette.Templating.Cache');
|
||||
if ($helper = $cache->start($key)) {
|
||||
$parents[] = $helper;
|
||||
}
|
||||
return $helper;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Ends the output cache.
|
||||
* @param Nette\Caching\OutputHelper[] $parents
|
||||
*/
|
||||
public static function endCache(array &$parents, array $args = null): void
|
||||
{
|
||||
$helper = array_pop($parents);
|
||||
if ($helper instanceof Nette\Caching\OutputHelper) {
|
||||
if (isset($args['dependencies'])) {
|
||||
$args += $args['dependencies']();
|
||||
}
|
||||
if (isset($args['expire'])) {
|
||||
$args['expiration'] = $args['expire']; // back compatibility
|
||||
}
|
||||
$helper->dependencies[Cache::TAGS] = $args['tags'] ?? null;
|
||||
$helper->dependencies[Cache::EXPIRATION] = $args['expiration'] ?? '+ 7 days';
|
||||
$helper->end();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user