Optimize admin for speed (only load frontend pages on demand)

This commit is contained in:
Matias Griese
2019-08-22 19:25:59 +03:00
parent 62e0beb371
commit 5e219c8197
4 changed files with 89 additions and 26 deletions

View File

@@ -2,7 +2,7 @@
## mm/dd/2019 ## mm/dd/2019
1. [](#improved) 1. [](#improved)
* Optimize getNotifications and getUpdates tasks for speed * Optimize admin for speed (only load frontend pages on demand)
# v1.10.0-beta.5 # v1.10.0-beta.5
## 08/11/2019 ## 08/11/2019

View File

@@ -161,10 +161,7 @@ class AdminPlugin extends Plugin
if ($this->isAdminPath()) { if ($this->isAdminPath()) {
$pages = $this->grav['pages']; $pages = $this->grav['pages'];
if (method_exists($pages, 'disablePages')) { if (method_exists($pages, 'disablePages')) {
$task = $this->grav['task']; $pages->disablePages();
if (in_array($task, ['getNotifications', 'getUpdates'])) {
$pages->disablePages();
}
} }
try { try {
$this->grav['session']->init(); $this->grav['session']->init();
@@ -436,8 +433,11 @@ class AdminPlugin extends Plugin
$this->session->expert = $this->session->expert ?? false; $this->session->expert = $this->session->expert ?? false;
} }
// FIXME: START
/** @var Pages $pages */ /** @var Pages $pages */
/*
$pages = $this->grav['pages']; $pages = $this->grav['pages'];
$pages->enablePages();
$this->grav['admin']->routes = $pages->routes(); $this->grav['admin']->routes = $pages->routes();
@@ -452,13 +452,12 @@ class AdminPlugin extends Plugin
if ($page) { if ($page) {
$page->route($home); $page->route($home);
} }
*/
// FIXME: STOP
// Make local copy of POST. // Make local copy of POST.
$post = $this->grav['uri']->post(); $post = $this->grav['uri']->post();
// Initialize Page Types
Pages::types();
// Handle tasks. // Handle tasks.
$this->admin->task = $task = $this->grav['task']; $this->admin->task = $task = $this->grav['task'];
if ($task) { if ($task) {
@@ -475,8 +474,6 @@ class AdminPlugin extends Plugin
// make sure page is not frozen! // make sure page is not frozen!
unset($this->grav['page']); unset($this->grav['page']);
$this->admin->pagesCount();
// Replace page service with admin. // Replace page service with admin.
$this->grav['page'] = function () use ($self) { $this->grav['page'] = function () use ($self) {
$page = new Page(); $page = new Page();

View File

@@ -3,6 +3,7 @@
namespace Grav\Plugin\Admin; namespace Grav\Plugin\Admin;
use DateTime; use DateTime;
use Grav\Common\Cache;
use Grav\Common\Data; use Grav\Common\Data;
use Grav\Common\File\CompiledYamlFile; use Grav\Common\File\CompiledYamlFile;
use Grav\Common\GPM\GPM; use Grav\Common\GPM\GPM;
@@ -330,7 +331,10 @@ class Admin
public function getCurrentRoute() public function getCurrentRoute()
{ {
$pages = Grav::instance()['pages']; /** @var Pages $pages */
$pages = $this->grav['pages'];
$pages->enablePages();
$route = '/' . ltrim($this->route, '/'); $route = '/' . ltrim($this->route, '/');
/** @var PageInterface $page */ /** @var PageInterface $page */
@@ -423,7 +427,10 @@ class Admin
$files = []; $files = [];
$grav = Grav::instance(); $grav = Grav::instance();
/** @var Pages $pages */
$pages = $grav['pages']; $pages = $grav['pages'];
$pages->enablePages();
$route = '/' . ltrim($grav['admin']->route, '/'); $route = '/' . ltrim($grav['admin']->route, '/');
/** @var PageInterface $page */ /** @var PageInterface $page */
@@ -791,11 +798,15 @@ class Admin
$file = File::instance($filename); $file = File::instance($filename);
/** @var Pages $pages */
$pages = $this->grav['pages'];
$pages->enablePages();
$obj = new \stdClass(); $obj = new \stdClass();
$obj->title = $file->basename(); $obj->title = $file->basename();
$obj->path = $file->filename(); $obj->path = $file->filename();
$obj->file = $file; $obj->file = $file;
$obj->page = $this->grav['pages']->get(dirname($obj->path)); $obj->page = $pages->get(dirname($obj->path));
$fileInfo = pathinfo($obj->title); $fileInfo = pathinfo($obj->title);
$filename = str_replace(['@3x', '@2x'], '', $fileInfo['filename']); $filename = str_replace(['@3x', '@2x'], '', $fileInfo['filename']);
@@ -886,6 +897,7 @@ class Admin
{ {
/** @var Pages $pages */ /** @var Pages $pages */
$pages = $this->grav['pages']; $pages = $this->grav['pages'];
$pages->enablePages();
if ($unique) { if ($unique) {
$routes = array_unique($pages->routes()); $routes = array_unique($pages->routes());
@@ -904,7 +916,19 @@ class Admin
public function pagesCount() public function pagesCount()
{ {
if (!$this->pages_count) { if (!$this->pages_count) {
$this->pages_count = count($this->grav['pages']->all()); /** @var Cache $cache */
$cache = $this->grav['cache'];
$count = $cache->fetch('admin-pages-count');
if (false === $count) {
/** @var Pages $pages */
$pages = $this->grav['pages'];
$pages->enablePages();
$count = count($pages->all());
$cache->save('admin-pages-count', $count);
}
$this->pages_count = $count;
} }
return $this->pages_count; return $this->pages_count;
@@ -937,8 +961,12 @@ class Admin
*/ */
public function accessLevels() public function accessLevels()
{ {
if (method_exists($this->grav['pages'], 'accessLevels')) { /** @var Pages $pages */
return $this->grav['pages']->accessLevels(); $pages = $this->grav['pages'];
$pages->enablePages();
if (method_exists($pages, 'accessLevels')) {
return $pages->accessLevels();
} }
return []; return [];
@@ -1143,6 +1171,7 @@ class Admin
{ {
/** @var Pages $pages */ /** @var Pages $pages */
$pages = $this->grav['pages']; $pages = $this->grav['pages'];
$pages->enablePages();
$latest = []; $latest = [];
@@ -1691,6 +1720,7 @@ class Admin
{ {
/** @var Pages $pages */ /** @var Pages $pages */
$pages = $this->grav['pages']; $pages = $this->grav['pages'];
$pages->enablePages();
if ($path && $path[0] !== '/') { if ($path && $path[0] !== '/') {
$path = "/{$path}"; $path = "/{$path}";
@@ -1779,8 +1809,12 @@ class Admin
{ {
$reports = new ArrayCollection(); $reports = new ArrayCollection();
/** @var Pages $pages */
$pages = $this->grav['pages'];
$pages->enablePages();
// Default to XSS Security Report // Default to XSS Security Report
$result = Security::detectXssFromPages($this->grav['pages'], true); $result = Security::detectXssFromPages($pages, true);
$reports['Grav Security Check'] = $this->grav['twig']->processTemplate('reports/security.html.twig', [ $reports['Grav Security Check'] = $this->grav['twig']->processTemplate('reports/security.html.twig', [
'result' => $result, 'result' => $result,
@@ -1847,7 +1881,9 @@ class Admin
if (!$page_files) { if (!$page_files) {
$page_files = []; $page_files = [];
/** @var Pages $pages */
$pages = $this->grav['pages']; $pages = $this->grav['pages'];
$pages->enablePages();
if ($param_page) { if ($param_page) {
$page = $pages->dispatch($param_page); $page = $pages->dispatch($param_page);
@@ -2051,11 +2087,14 @@ class Admin
*/ */
public function pages() public function pages()
{ {
/** @var Collection $pages */ /** @var Pages $pages */
$pages = $this->grav['pages']->all(); $pages = $this->grav['pages'];
$pages->enablePages();
$collection = $pages->all();
$pagesWithFiles = []; $pagesWithFiles = [];
foreach ($pages as $page) { foreach ($collection as $page) {
if (count($page->media()->all())) { if (count($page->media()->all())) {
$pagesWithFiles[] = $page; $pagesWithFiles[] = $page;
} }

View File

@@ -1249,7 +1249,15 @@ class AdminController extends AdminBaseController
if ($data['route'] === '' || $data['route'] === '/') { if ($data['route'] === '' || $data['route'] === '/') {
$path = $this->grav['locator']->findResource('page://'); $path = $this->grav['locator']->findResource('page://');
} else { } else {
$path = $this->grav['page']->find($data['route'])->path(); /** @var Pages $pages */
$pages = $this->grav['pages'];
$pages->enablePages();
$page = $pages->find($data['route']);
if (!$page) {
return false;
}
$path = $page->path();
} }
$orderOfNewFolder = static::getNextOrderInFolder($path); $orderOfNewFolder = static::getNextOrderInFolder($path);
@@ -1276,6 +1284,7 @@ class AdminController extends AdminBaseController
/** @var Pages $pages */ /** @var Pages $pages */
$pages = $this->grav['pages']; $pages = $this->grav['pages'];
$pages->enablePages();
// Find new parent page in order to build the path. // Find new parent page in order to build the path.
$route = $data['route'] ?? dirname($this->admin->route); $route = $data['route'] ?? dirname($this->admin->route);
@@ -1400,6 +1409,7 @@ class AdminController extends AdminBaseController
try { try {
/** @var Pages $pages */ /** @var Pages $pages */
$pages = $this->grav['pages']; $pages = $this->grav['pages'];
$pages->enablePages();
// Get the current page. // Get the current page.
$original_page = $this->admin->page(true); $original_page = $this->admin->page(true);
@@ -1727,8 +1737,12 @@ class AdminController extends AdminBaseController
$rawroute = $data['rawroute'] ?? null; $rawroute = $data['rawroute'] ?? null;
if ($rawroute) { if ($rawroute) {
/** @var Pages $pages */
$pages = $this->grav['pages'];
$pages->enablePages();
/** @var PageInterface $page */ /** @var PageInterface $page */
$page = $this->grav['pages']->dispatch($rawroute); $page = $pages->dispatch($rawroute);
if ($page) { if ($page) {
$child_type = $page->childType(); $child_type = $page->childType();
@@ -1766,8 +1780,12 @@ class AdminController extends AdminBaseController
$flags = !empty($data['flags']) ? array_map('strtolower', explode(',', $data['flags'])) : []; $flags = !empty($data['flags']) ? array_map('strtolower', explode(',', $data['flags'])) : [];
$queries = !empty($data['query']) ? explode(',', $data['query']) : []; $queries = !empty($data['query']) ? explode(',', $data['query']) : [];
/** @var Pages $pages */
$pages = $this->grav['pages'];
$pages->enablePages();
/** @var Collection $collection */ /** @var Collection $collection */
$collection = $this->grav['pages']->all(); $collection = $pages->all();
if (count($flags)) { if (count($flags)) {
// Filter by state // Filter by state
@@ -2247,7 +2265,11 @@ class AdminController extends AdminBaseController
// Valid types are dir|file|link // Valid types are dir|file|link
$default_filters = ['type'=> ['root', 'dir'], 'name' => null, 'extension' => null]; $default_filters = ['type'=> ['root', 'dir'], 'name' => null, 'extension' => null];
$page_instances = Grav::instance()['pages']->instances(); /** @var Pages $pages */
$pages = $this->grav['pages'];
$pages->enablePages();
$page_instances = $pages->instances();
$is_page = $data['page'] ?? true; $is_page = $data['page'] ?? true;
$route = $data['route'] ?? null; $route = $data['route'] ?? null;
@@ -2286,7 +2308,7 @@ class AdminController extends AdminBaseController
if ($is_page) { if ($is_page) {
/** @var PageInterface $page */ /** @var PageInterface $page */
$page = $this->grav['pages']->dispatch($route); $page = $pages->dispatch($route);
$path = $page ? $page->path() : null; $path = $page ? $page->path() : null;
} else { } else {
// Try a physical path // Try a physical path
@@ -2455,6 +2477,10 @@ class AdminController extends AdminBaseController
{ {
$input = (array)$this->data; $input = (array)$this->data;
/** @var Pages $pages */
$pages = $this->grav['pages'];
$pages->enablePages();
if (isset($input['folder']) && $input['folder'] !== $page->value('folder')) { if (isset($input['folder']) && $input['folder'] !== $page->value('folder')) {
$order = $page->value('order'); $order = $page->value('order');
$ordering = $order ? sprintf('%02d.', $order) : ''; $ordering = $order ? sprintf('%02d.', $order) : '';
@@ -2540,7 +2566,8 @@ class AdminController extends AdminBaseController
*/ */
protected function findFirstAvailable($item, PageInterface $page) protected function findFirstAvailable($item, PageInterface $page)
{ {
if (!$page->parent()->children()) { $parent = $page->parent();
if (!$parent || !$parent->children()) {
return $page->{$item}(); return $page->{$item}();
} }
@@ -2564,7 +2591,7 @@ class AdminController extends AdminBaseController
};*/ };*/
$highest = 1; $highest = 1;
$siblings = $page->parent()->children(); $siblings = $parent->children();
$findCorrectAppendedNumber = function ($item, $page_item, $highest) use ( $findCorrectAppendedNumber = function ($item, $page_item, $highest) use (
$siblings, $siblings,
&$findCorrectAppendedNumber, &$findCorrectAppendedNumber,