Add caching

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This commit is contained in:
Roeland Jago Douma 2017-03-22 15:20:29 +01:00
parent 48158c8bec
commit 242f8964cf
No known key found for this signature in database
GPG Key ID: F941078878347C0C
2 changed files with 44 additions and 7 deletions

View File

@ -22,6 +22,7 @@
*/ */
namespace OC\Template; namespace OC\Template;
use OCP\ICache;
use OCP\Files\IAppData; use OCP\Files\IAppData;
use OCP\Files\NotFoundException; use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException; use OCP\Files\NotPermittedException;
@ -36,16 +37,22 @@ class JSCombiner {
/** @var IURLGenerator */ /** @var IURLGenerator */
protected $urlGenerator; protected $urlGenerator;
/** @var ICache */
protected $depsCache;
/** /**
* JSCombiner constructor. * JSCombiner constructor.
* *
* @param IAppData $appData * @param IAppData $appData
* @param IURLGenerator $urlGenerator * @param IURLGenerator $urlGenerator
* @param ICache $depsCache
*/ */
public function __construct(IAppData $appData, public function __construct(IAppData $appData,
IURLGenerator $urlGenerator) { IURLGenerator $urlGenerator,
ICache $depsCache) {
$this->appData = $appData; $this->appData = $appData;
$this->urlGenerator = $urlGenerator; $this->urlGenerator = $urlGenerator;
$this->depsCache = $depsCache;
} }
/** /**
@ -79,8 +86,27 @@ class JSCombiner {
* @return bool * @return bool
*/ */
protected function isCached($fileName, ISimpleFolder $folder) { protected function isCached($fileName, ISimpleFolder $folder) {
$fileName = str_replace('.json', '.js', $fileName) . '.deps';
try {
$deps = $this->depsCache->get($folder->getName() . '-' . $fileName);
if ($deps === null) {
$depFile = $folder->getFile($fileName);
$deps = $depFile->getContent();
$this->depsCache->set($folder->getName() . '-' . $fileName, $deps);
}
$deps = json_decode($deps, true);
foreach ($deps as $file=>$mtime) {
if (!file_exists($file) || filemtime($file) > $mtime) {
return false; return false;
} }
}
return true;
} catch(NotFoundException $e) {
return false;
}
}
/** /**
* @param string $path * @param string $path
@ -89,17 +115,19 @@ class JSCombiner {
* @return bool * @return bool
*/ */
protected function cache($path, $fileName, ISimpleFolder $folder) { protected function cache($path, $fileName, ISimpleFolder $folder) {
$data = json_decode(file_get_contents($path . '/' . $fileName)); $deps = [];
$fullPath = $path . '/' . $fileName;
$data = json_decode(file_get_contents($fullPath));
$deps[$fullPath] = filemtime($fullPath);
$res = ''; $res = '';
$deps = [];
foreach ($data as $file) { foreach ($data as $file) {
$filePath = $path . '/' . $file; $filePath = $path . '/' . $file;
if (is_file($filePath)) { if (is_file($filePath)) {
$res .= file_get_contents($path . '/' . $file); $res .= file_get_contents($filePath);
$res .= PHP_EOL . PHP_EOL; $res .= PHP_EOL . PHP_EOL;
$deps[$file] = filemtime($path . '/' . $file); $deps[$filePath] = filemtime($filePath);
} }
} }
@ -110,8 +138,16 @@ class JSCombiner {
$cachedfile = $folder->newFile($fileName); $cachedfile = $folder->newFile($fileName);
} }
$depFileName = $fileName . '.deps';
try {
$depFile = $folder->getFile($depFileName);
} catch (NotFoundException $e) {
$depFile = $folder->newFile($depFileName);
}
try { try {
$cachedfile->putContent($res); $cachedfile->putContent($res);
$depFile->putContent(json_encode($deps));
return true; return true;
} catch (NotPermittedException $e) { } catch (NotPermittedException $e) {
return false; return false;

View File

@ -253,7 +253,8 @@ class TemplateLayout extends \OC_Template {
array( \OC::$SERVERROOT => \OC::$WEBROOT ), array( \OC::$SERVERROOT => \OC::$WEBROOT ),
new JSCombiner( new JSCombiner(
\OC::$server->getAppDataDir('js'), \OC::$server->getAppDataDir('js'),
\OC::$server->getURLGenerator() \OC::$server->getURLGenerator(),
\OC::$server->getMemCacheFactory()->create('JS')
) )
); );
$locator->find($scripts); $locator->find($scripts);