Browse Source

feat:缓存

igb 3 months ago
parent
commit
30f8e67f08

+ 4 - 1
app/Http/Controllers/CollectionController.php

@@ -82,13 +82,16 @@ class CollectionController extends Controller
 
         // 构建导航数据 结束
 
+        // 构建缓存键
+        $cacheKey = "collection_tag_{$tag->id}_page_{$pages->currentPage()}";
+
         //模板支持多级目录,需要目录符号
         $output = LiquidRenderer::render('collection_list.liquid', [
             'tag' => $tag,
             'pages' => $pages,
             'paginator' => $paginator, // 分页信息
             'breadcrumbs' => $breadcrumbs,
-        ]);
+        ],$cacheKey);
 
         return response($output);
     }

+ 2 - 1
app/Http/Controllers/HomeController.php

@@ -15,10 +15,11 @@ class HomeController extends Controller
     public function index()
     {
 
+        $cacheKey=getDistId().'-home';
         //模板支持多级目录,需要目录符号
         $output = LiquidRenderer::render('home.liquid', [
 
-        ]);
+        ],$cacheKey);
 
         return response($output);
 

+ 2 - 1
app/Http/Controllers/PageController.php

@@ -22,8 +22,9 @@ class PageController extends Controller
      */
     public function list()
     {
+        $cacheKey = "page_list_dist_" . getDistId() . "_page_" . request()->get('page', 1);
         $pages = SitePage::paginate(10)->where('dist_id', getDistId())->where('status', '1'); // 每页显示10个页面
-        return $this->liquidRenderer->render('pages.list', ['pages' => $pages]);
+        return $this->liquidRenderer->render('pages.list', ['pages' => $pages],$cacheKey);
     }
 
     /**

+ 4 - 1
app/Http/Controllers/ProductController.php

@@ -80,13 +80,16 @@ class ProductController extends Controller
             'name' => $category->name,
         ];
 
+        // 构建缓存键
+        $cacheKey = "product_category_{$category->id}_page_{$products->currentPage()}";
+
         // 渲染模板并传递数据
         return $this->liquidRenderer->render('products_categories.liquid', [
             'category' => $category, // 分类名称
             'products' => $products,           // 分类下的产品
             'paginator' => $paginator, // 分页信息
             'breadcrumbs' => $breadcrumbs,
-        ]);
+        ], $cacheKey);
 
     }
 

+ 21 - 15
app/Http/Controllers/SitemapController.php

@@ -2,29 +2,35 @@
 
 namespace App\Http\Controllers;
 
-use Illuminate\Http\Request;
-
+use Illuminate\Support\Facades\Cache;
 use App\Models\DistProduct;
-use App\Models\DistPages;
+use App\Models\SitePage as DistPages;
 use App\Models\DistVideo;
 
 class SitemapController extends Controller
 {
-
-    //sitemap 特殊,使用内置模板来生成
     public function index()
     {
-        // 获取产品、文章和视频数据
-        $dist_products = DistProduct::where('enabled', 1)->where('dist_id', getDistId())->get(); // 获取所有字段
-        $dist_pages = DistPages::where('status', 1)->where('dist_id', getDistId())->get(); // 获取所有字段
-        $dist_videos = DistVideo::where('enabled', 1)->where('dist_id', getDistId())->get(); // 获取所有字段
+        // 定义缓存键和时长
+        $cacheKey = "sitemap::sitemap_index_" . getDistId();
+        $cacheDuration = 60 * 60; // 缓存时间(秒):60 分钟
+
+        // 获取缓存数据或重新生成
+        $sitemapData = Cache::remember($cacheKey, $cacheDuration, function () {
+            // 查询数据
+            $dist_products = DistProduct::where('enabled', 1)->where('dist_id', getDistId())->get();
+            $dist_pages = DistPages::where('status', 1)->where('dist_id', getDistId())->get();
+            $dist_videos = DistVideo::where('enabled', 1)->where('dist_id', getDistId())->get();
 
+            // 返回查询结果
+            return [
+                'dist_products' => $dist_products,
+                'dist_pages' => $dist_pages,
+                'dist_videos' => $dist_videos,
+            ];
+        });
 
-        // 创建一个视图来生成 XML
-        return response()->view('sitemap.index', [
-            'dist_products' => $dist_products,
-            'dist_pages' => $dist_pages,
-            'dist_videos' => $dist_videos,
-        ])->header('Content-Type', 'application/xml');
+        // 创建视图并返回响应
+        return response()->view('sitemap.index', $sitemapData)->header('Content-Type', 'application/xml');
     }
 }

+ 4 - 1
app/Http/Controllers/VideoController.php

@@ -79,13 +79,16 @@ class VideoController extends Controller
             'name' => $category->name,
         ];
 
+        // 构建缓存键
+        $cacheKey = "video_category_{$category->id}_page_{$videos->currentPage()}";
+
         // 渲染模板并传递数据
         return $this->liquidRenderer->render('videos_categories.liquid', [
             'category' => $category, // 分类名称
             'videos' => $videos,           // 分类下的产品
             'paginator' => $paginator, // 分页信息
             'breadcrumbs' => $breadcrumbs,
-        ]);
+        ], $cacheKey);
     }
 
 

+ 3 - 0
app/Http/Middleware/LoadDistData.php

@@ -57,6 +57,9 @@ class LoadDistData
         }
 
 
+        //补充domain
+        $dist->domain=$domain;
+
         // 全局共享  数据
         app()->instance('dist', $dist);
         // 将找到的 dist 数据添加到请求中,方便后续使用

+ 59 - 7
app/Services/LiquidRenderer.php

@@ -2,6 +2,8 @@
 
 namespace App\Services;
 
+use Illuminate\Support\Facades\Cache;
+use App\Http\Controllers\ProductController;
 use App\Services\LiquidTags\LiquidTagProduct;
 use App\Services\LiquidTags\LiquidTagVideo;
 use App\Services\LiquidTags\LiquidTagBanner;
@@ -22,12 +24,60 @@ class LiquidRenderer
     protected static ?string $baseTemplatePath = null;
 
     // 渲染 Liquid 模板
-    public static function render(string $templateName, array $data = []): string
+    public static function render(string $templateName, array $data = [],?string $cacheKey = null): string
     {
 
         self::initializeLiquidSettings();
         self::initializeBaseTemplatePath();
 
+
+        // 如果提供了缓存键,则检查和设置缓存
+        if ($cacheKey) {
+            $cacheDuration = config('liquid.cache_duration', 300); // 默认缓存时间为 300 秒
+
+            // 检查缓存是否存在
+            $domain=app('dist')->domain;
+            if(!$domain)
+            {
+                abort('403');
+            }
+            return Cache::tags([$domain, 'dist'])->remember("liquid_{$cacheKey}", $cacheDuration, function () use ($templateName, $data) {
+                return self::processTemplate($templateName, $data);
+            });
+        }
+
+        // 如果没有提供缓存键,直接渲染模板
+        return self::processTemplate($templateName, $data);
+
+//        $template = self::createTemplateInstance();
+//
+//        $template->registerTag('page', LiquidTagPage::class);
+//        $template->registerTag('product', LiquidTagProduct::class);
+//        $template->registerTag('video', LiquidTagVideo::class);
+//        $template->registerTag('contact', LiquidTagContactUs::class);
+//        $template->registerTag('banner', LiquidTagBanner::class);
+//        $template->registerTag('contactus', LiquidTagContactUs::class);
+//        $template->registerFilter(Filters::class);
+//
+//
+//        //获取全局配置,合并到当前配置
+//        $config = self::getGlobalConfig();
+//        $data['site'] = array_merge($data['site'] ?? [], $config);
+//
+//
+//        try {
+//            $parsedTemplate = $template->parseFile($templateName);
+//        } catch (\Exception $e) {
+//            throw new \RuntimeException("Template not found: {$templateName}", 0, $e);
+//        }
+//
+//        return $parsedTemplate->render($data);
+    }
+
+
+    // 处理模板渲染逻辑
+    private static function processTemplate(string $templateName, array $data): string
+    {
         $template = self::createTemplateInstance();
 
         $template->registerTag('page', LiquidTagPage::class);
@@ -38,22 +88,20 @@ class LiquidRenderer
         $template->registerTag('contactus', LiquidTagContactUs::class);
         $template->registerFilter(Filters::class);
 
-
-        //获取全局配置,合并到当前配置
+        // 获取全局配置,合并到当前配置
         $config = self::getGlobalConfig();
         $data['site'] = array_merge($data['site'] ?? [], $config);
 
-
         try {
             $parsedTemplate = $template->parseFile($templateName);
         } catch (\Exception $e) {
             throw new \RuntimeException("Template not found: {$templateName}", 0, $e);
         }
 
-        return $parsedTemplate->render($data);
+        $now_string=date('Y-m-d H:i:s');
+        return $parsedTemplate->render($data);//."<!-- CACHE {$now_string}-->";
     }
 
-
     // 初始化基础模板路径
     private static function initializeBaseTemplatePath(): void
     {
@@ -77,7 +125,11 @@ class LiquidRenderer
     private static function createTemplateInstance(): Template
     {
         $template = new Template(self::$baseTemplatePath);
-        //$template->setCache(new FileCache(['cache_dir' => storage_path('framework/cache/data')]));
+        // 检查配置文件是否启用缓存
+        $enableCache = config('liquid.cache_enabled', false); // 默认不开启缓存
+        if ($enableCache) {
+            $template->setCache(new FileCache(['cache_dir' => storage_path('framework/cache/data')]));
+        }
         return $template;
     }
 

+ 5 - 1
config/liquid.php

@@ -19,7 +19,11 @@ return [
     // 图片的基础 URL
     'image_base_url' => env('IMAGE_BASE_URL', 'https://mietubl-dev.oss-accelerate.aliyuncs.com/'),
 
-    // 图片的基础 URL
+    //默认页面缓存超时设置300秒
+    'cache_duration' => env('CACHE_DURATION', 300),
+
+    //是否开始页面编译缓存
+    'cache_enabled' => env('CACHE_ENABLED', false),
 
 ];