mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
NEW Add memory cache to ThemeResourceLoader::findTemplate()
For large sites, this reduces the number of file_exists, Path::join, getThemePaths etc calls and can contribute to 26% reduction in TTFB load time
This commit is contained in:
parent
d68f02ad25
commit
9ea7b58a8f
@ -17,6 +17,13 @@ class ThemeResourceLoader
|
|||||||
*/
|
*/
|
||||||
private static $instance;
|
private static $instance;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal memory cache for large sets of repeated calls
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected static $cacheData = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The base path of the application
|
* The base path of the application
|
||||||
*
|
*
|
||||||
@ -174,6 +181,12 @@ class ThemeResourceLoader
|
|||||||
*/
|
*/
|
||||||
public function findTemplate($template, $themes = null)
|
public function findTemplate($template, $themes = null)
|
||||||
{
|
{
|
||||||
|
// Look for a cached result for this data set
|
||||||
|
$cacheKey = json_encode($template) . json_encode($themes);
|
||||||
|
if (isset(static::$cacheData[$cacheKey])) {
|
||||||
|
return static::$cacheData[$cacheKey];
|
||||||
|
}
|
||||||
|
|
||||||
if ($themes === null) {
|
if ($themes === null) {
|
||||||
$themes = SSViewer::get_themes();
|
$themes = SSViewer::get_themes();
|
||||||
}
|
}
|
||||||
@ -196,7 +209,7 @@ class ThemeResourceLoader
|
|||||||
if (is_array($template)) {
|
if (is_array($template)) {
|
||||||
$path = $this->findTemplate($template, $themes);
|
$path = $this->findTemplate($template, $themes);
|
||||||
if ($path) {
|
if ($path) {
|
||||||
return $path;
|
return static::$cacheData[$cacheKey] = $path;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -205,7 +218,7 @@ class ThemeResourceLoader
|
|||||||
// pass in templates without extensions in order for template manifest to find
|
// pass in templates without extensions in order for template manifest to find
|
||||||
// files dynamically.
|
// files dynamically.
|
||||||
if (substr($template, -3) == '.ss' && file_exists($template)) {
|
if (substr($template, -3) == '.ss' && file_exists($template)) {
|
||||||
return $template;
|
return static::$cacheData[$cacheKey] = $template;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check string template identifier
|
// Check string template identifier
|
||||||
@ -220,13 +233,13 @@ class ThemeResourceLoader
|
|||||||
$pathParts = [ $this->base, $themePath, 'templates', $head, $type, $tail ];
|
$pathParts = [ $this->base, $themePath, 'templates', $head, $type, $tail ];
|
||||||
$path = Path::join($pathParts) . '.ss';
|
$path = Path::join($pathParts) . '.ss';
|
||||||
if (file_exists($path)) {
|
if (file_exists($path)) {
|
||||||
return $path;
|
return static::$cacheData[$cacheKey] = $path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// No template found
|
// No template found
|
||||||
return null;
|
return static::$cacheData[$cacheKey] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user