From f3b1951d25f2f4978638f16f4ce838c735f7ac57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Kv=C3=A1=C4=8Dek?= Date: Wed, 22 Feb 2017 01:40:26 +0100 Subject: [PATCH] FEATURE: cache most used SQL queries --- app/CMS/Enumerations/ModulesHandlerToId.php | 5 +++- app/CMS/Helpers/CurrentTemplate.php | 24 ++++++++++++-------- app/CMS/Helpers/Settings.php | 7 ++++-- app/CMS/Helpers/WidgetAreas.php | 19 +++++++++++----- app/Console/Commands/InstallModule.php | 5 ++++ app/Console/Commands/SetTemplate.php | 4 ++++ app/Http/Controllers/Visitor/ContentPage.php | 9 +++++--- app/Http/Controllers/Visitor/Homepage.php | 7 +++++- app/Providers/ModuleManager.php | 16 +++++++------ config/cache.php | 13 +++++++---- 10 files changed, 74 insertions(+), 35 deletions(-) diff --git a/app/CMS/Enumerations/ModulesHandlerToId.php b/app/CMS/Enumerations/ModulesHandlerToId.php index 044586bf..ae86ccbe 100644 --- a/app/CMS/Enumerations/ModulesHandlerToId.php +++ b/app/CMS/Enumerations/ModulesHandlerToId.php @@ -2,6 +2,7 @@ namespace App\CMS\Enumerations; use App\Models\Module; +use Illuminate\Support\Facades\Cache; class ModulesHandlerToId extends BaseEnumeration { @@ -12,7 +13,9 @@ class ModulesHandlerToId extends BaseEnumeration */ protected static function init() { - $modules = Module::all(['handler', 'id']); + $modules = Cache::rememberForever('module-handler-to-id-enumeration', function () { + return Module::all(['handler', 'id']); + }); foreach ($modules as $module) { self::push($module->handler, $module->id); diff --git a/app/CMS/Helpers/CurrentTemplate.php b/app/CMS/Helpers/CurrentTemplate.php index b8b2d796..222d455a 100644 --- a/app/CMS/Helpers/CurrentTemplate.php +++ b/app/CMS/Helpers/CurrentTemplate.php @@ -6,6 +6,7 @@ use App\Models\Content\Content; use App\Models\Module; use App\Models\User; use Illuminate\Database\QueryException; +use Illuminate\Support\Facades\Cache; class CurrentTemplate implements TemplateHandler { @@ -20,16 +21,19 @@ class CurrentTemplate implements TemplateHandler public static function get() { if (!self::$initialized) { - try { - self::$template = Module::where('is_template', true) - ->where('enabled', true) - ->first(); - } catch (QueryException $e) { - throw new \ErrorException('DB not migrated, please, do so!'); - } - if (self::$template) { - self::$template->module_settings = json_decode(self::$template->module_settings); - } + self::$template = Cache::rememberForever('current-template', function () { + $template = Module::where('is_template', true) + ->where('enabled', true) + ->first(); + + // todo remove after adding $casts into Module model + if ($template) { + $template->module_settings = json_decode($template->module_settings); + } + + return $template; + }); + self::$initialized = true; } diff --git a/app/CMS/Helpers/Settings.php b/app/CMS/Helpers/Settings.php index bb1097eb..dac28723 100644 --- a/app/CMS/Helpers/Settings.php +++ b/app/CMS/Helpers/Settings.php @@ -3,6 +3,7 @@ namespace App\CMS\Helpers; use App\Models\Settings as SettingsModel; +use Illuminate\Support\Facades\Cache; /** * Class Settings @@ -76,8 +77,10 @@ class Settings private static function init() { if (!self::$initialized) { - $model = new SettingsModel(); - self::$settings = $model->getAll(); + self::$settings = Cache::remember('settings', config('cache.settingCacheLifetime'), function () { + $model = new SettingsModel(); + return $model->getAll(); + }); } } } \ No newline at end of file diff --git a/app/CMS/Helpers/WidgetAreas.php b/app/CMS/Helpers/WidgetAreas.php index 6aa177b5..9b277701 100644 --- a/app/CMS/Helpers/WidgetAreas.php +++ b/app/CMS/Helpers/WidgetAreas.php @@ -2,6 +2,7 @@ namespace App\CMS\Helpers; use App\Models\Widgets\WidgetArea; +use Illuminate\Support\Facades\Cache; class WidgetAreas { @@ -14,8 +15,9 @@ class WidgetAreas protected static function saveRenderedWidgetArea($widgets) { foreach ($widgets as $widget) { - if (!isset(self::$widgetAreas[$widget->widget_area_code])) + if (!isset(self::$widgetAreas[$widget->widget_area_code])) { self::$widgetAreas[$widget->widget_area_code] = ''; + } self::$widgetAreas[$widget->widget_area_code] .= Widget::render($widget); } @@ -23,9 +25,11 @@ class WidgetAreas protected static function loadWidgetArea($uniqueCode) { - $widgetArea = new WidgetArea(); - $widgets = $widgetArea->getWidgets($uniqueCode) + $widgets = Cache::remember('widget-' . $uniqueCode, setting('widgetCacheLifetime', 5), function () use ($uniqueCode) { + $widgetArea = new WidgetArea(); + return $widgetArea->getWidgets($uniqueCode) ->get(); + }); WidgetArea::where('code', $uniqueCode) ->increment('viewed'); @@ -35,12 +39,15 @@ class WidgetAreas protected static function initWidgetAreas() { - if (self::$initialized) + if (self::$initialized) { return; + } - $widgetArea = new WidgetArea(); - $widgets = $widgetArea->getWidgets() + $widgets = Cache::remember('widgets', setting('widgetCacheLifetime', 5), function () { + $widgetArea = new WidgetArea(); + return $widgetArea->getWidgets() ->get(); + }); self::saveRenderedWidgetArea($widgets); self::$initialized = true; diff --git a/app/Console/Commands/InstallModule.php b/app/Console/Commands/InstallModule.php index 3fc9c292..5bf435e5 100644 --- a/app/Console/Commands/InstallModule.php +++ b/app/Console/Commands/InstallModule.php @@ -5,6 +5,7 @@ namespace App\Console\Commands; use App\Models\Module; use Illuminate\Console\Command; use Illuminate\Contracts\Filesystem\FileNotFoundException; +use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\File; use Symfony\Component\Console\Exception\InvalidArgumentException; use Symfony\Component\Routing\Exception\MissingMandatoryParametersException; @@ -63,6 +64,10 @@ class InstallModule extends Command // all mandatory fields are present, we can write it into database and create modules.json $this->installModule($config); + // delete cache + Cache::forget('enabled-modules'); + Cache::forget('module-handler-to-id-enumeration'); + // inform user $this->line('Module ' . $name . ' successfuly installed'); } diff --git a/app/Console/Commands/SetTemplate.php b/app/Console/Commands/SetTemplate.php index 462d5127..f24c2a7b 100644 --- a/app/Console/Commands/SetTemplate.php +++ b/app/Console/Commands/SetTemplate.php @@ -4,6 +4,7 @@ namespace App\Console\Commands; use App\Models\Module; use Illuminate\Console\Command; +use Illuminate\Support\Facades\Cache; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class SetTemplate extends Command @@ -63,6 +64,9 @@ class SetTemplate extends Command return; } + // delete cached current template + Cache::forget('current-template'); + // theme written $this->line('Template successfully set up.'); diff --git a/app/Http/Controllers/Visitor/ContentPage.php b/app/Http/Controllers/Visitor/ContentPage.php index 01a59d3d..20088a61 100644 --- a/app/Http/Controllers/Visitor/ContentPage.php +++ b/app/Http/Controllers/Visitor/ContentPage.php @@ -2,11 +2,12 @@ namespace App\Http\Controllers\Visitor; -use App\Models\Content\Content as ContentModel; use App\CMS\Contracts\Repositories\Content; use App\CMS\Helpers\PageRenderer; use App\Http\Controllers\Controller; +use App\Models\Content\Content as ContentModel; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Cache; class ContentPage extends Controller { @@ -20,13 +21,15 @@ class ContentPage extends Controller */ function __construct(Content $content) { - $this->content = $content; } public function getPage($url) { - $page = $this->content->getByURL($url); + $contentModel = $this->content; + $page = Cache::remember('content-' . $url, setting('contentCacheLifetime', 5), function () use ($contentModel, $url) { + return $contentModel->getByURL($url); + }); // no page available if (!$page) { diff --git a/app/Http/Controllers/Visitor/Homepage.php b/app/Http/Controllers/Visitor/Homepage.php index eb175636..38b77969 100644 --- a/app/Http/Controllers/Visitor/Homepage.php +++ b/app/Http/Controllers/Visitor/Homepage.php @@ -2,12 +2,17 @@ namespace App\Http\Controllers\Visitor; +use Illuminate\Support\Facades\Cache; + class Homepage extends ContentPage { public function getIndex() { // try to find some homepage - $page = $this->content->getHomepage(); + $contentModel = $this->content; + $page = Cache::remember('hp', setting('homepageCacheLifetime', 5), function () use ($contentModel) { + return $contentModel->getHomepage(); + }); // test if we have any homepage if (!$page) { diff --git a/app/Providers/ModuleManager.php b/app/Providers/ModuleManager.php index ca771d88..5594544f 100644 --- a/app/Providers/ModuleManager.php +++ b/app/Providers/ModuleManager.php @@ -3,6 +3,7 @@ namespace App\Providers; use App\Models\Module; +use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Log; use Illuminate\Support\ServiceProvider; @@ -15,18 +16,19 @@ class ModuleManager extends ServiceProvider public function boot() { // this service provider needs published config - config is merged right after this service provider - try { + $modules = Cache::rememberForever('enabled-modules', function () { $modules = Module::where('enabled', true) ->get(); - } catch (\Exception $e) { - // ignore error - return; - } + + foreach ($modules as $module) { + $module->module_settings = json_decode($module->module_settings); + } + + return $modules; + }); // iterate over all modules and enable or disable them foreach ($modules as $module) { - $module->module_settings = json_decode($module->module_settings); - if ($module->is_template) { if (isset($module->module_settings->providers) && !empty($module->module_settings->providers)) { foreach ($module->module_settings->providers as $provider) { diff --git a/config/cache.php b/config/cache.php index 379135b0..caaeef77 100644 --- a/config/cache.php +++ b/config/cache.php @@ -13,7 +13,8 @@ return [ | */ - 'default' => env('CACHE_DRIVER', 'file'), + 'default' => env('CACHE_DRIVER', 'file'), + 'settingCacheLifetime' => env('SETTING_CACHE_LIFETIME', 10), /* |-------------------------------------------------------------------------- @@ -37,8 +38,8 @@ return [ ], 'database' => [ - 'driver' => 'database', - 'table' => 'cache', + 'driver' => 'database', + 'table' => 'cache', 'connection' => null, ], @@ -51,13 +52,15 @@ return [ 'driver' => 'memcached', 'servers' => [ [ - 'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100, + 'host' => '127.0.0.1', + 'port' => 11211, + 'weight' => 100, ], ], ], 'redis' => [ - 'driver' => 'redis', + 'driver' => 'redis', 'connection' => 'default', ],