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
1. [](#improved)
* Optimize getNotifications and getUpdates tasks for speed
* Optimize admin for speed (only load frontend pages on demand)
# v1.10.0-beta.5
## 08/11/2019

View File

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

View File

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

View File

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