【问题标题】:Laravel remember cacheLaravel 记忆缓存
【发布时间】:2021-11-24 21:55:05
【问题描述】:

我试图在主页上记住 6 分钟的缓存,但这是错误的。 我想一键输入 10 个参数( homepage-data ) 那我做错了什么?

public function index()
{
    $rememberKey = 'homepage-data';
    $minutes = 600;
    \Cache::remember($rememberKey, $minutes, function () {

        $breakingNews = BreakingNews::published();
        $rightSlider = Article::rightSlider()->take(20)->get();
        $leftSlider = Article::leftSlider()->take(9)->get();
        $shows = Show::publishedOrderShows()->take(10)->get();
        $blogs = Article::allBlogs()->take(12)->get();
        $latestNews = Article::latestNews()->whereNotIn('id', $rightSlider->pluck('id')->merge($leftSlider->pluck('id')))->take(5)->get();
        $otherNews = Article::otherNews()->whereNotIn('id', $rightSlider->pluck('id')->merge($leftSlider->pluck('id')))->take(2)->get();
        $otherNewsDown = Article::otherNews()->whereNotIn('id', $rightSlider->pluck('id')->merge($leftSlider->pluck('id'))->merge($otherNews->pluck('id')))->take(8)->get();
        $analyticNews = Article::allAnalytics()->take(4)->get();
        $populars = Article::popular()->take(10)->get();
        $quizzes = Quizze::quizOrderBy();

        return view('pages/home-page')->with([
            'breakingNews' => $breakingNews, 'rightSlider' => $rightSlider,
            'leftSlider' => $leftSlider, 'shows' => $shows, 'blogs' => $blogs, 'latestNews' => $latestNews,
            'otherNews' => $otherNews, 'otherNewsDown' => $otherNewsDown, 'analyticNews' => $analyticNews,
            'populars' => $populars, 'quizzes' => $quizzes
        ]);
    });
}

我收到“不允许序列化”的错误。

【问题讨论】:

  • 它给出了什么错误?
  • 你违背了缓存的目的。它将在每个请求上运行所有这些查询,而不是从缓存中检索它们。相反,查询应该在缓存内。阅读Laravel caching 了解它是如何工作的,特别是Retrieve & Store
  • 我编辑了代码,但出现“不允许序列化”闭包错误。 '错误
  • view 会返回一个请求,除非您使用 ->__toString(),否则这将不起作用。当然,您现在不会从函数本身返回任何内容。
  • 它正在工作 $rememberKey = 'homepage-data'; $分钟 = 600; $rightSlider = \Cache::remember($rememberKey, $minutes, function () { return Article::rightSlider()->take(20)->get(); });但我需要所有变量,不仅仅是一个好的感谢您的帮助

标签: php laravel caching


【解决方案1】:

对于您最初的问题,您将所有查询都放在缓存之外,从而破坏了缓存的目的。现在,您的闭包内部有太多内容,它正在尝试序列化视图。将视图移出缓存,将检索到的缓存分配给$data,然后将其用作数组发送回视图。

public function index()
{
   
    $rememberKey = 'homepage-data';
    $minutes = 600;
    $data = \Cache::remember($rememberKey, $minutes, function ()  {
        $breakingNews = BreakingNews::published();
        $rightSlider = Article::rightSlider()->take(20)->get();
        $leftSlider = Article::leftSlider()->take(9)->get();
        $shows = Show::publishedOrderShows()->take(10)->get();
        $blogs = Article::allBlogs()->take(12)->get();
        $latestNews = Article::latestNews()->whereNotIn('id', $rightSlider->pluck('id')->merge($leftSlider->pluck('id')))->take(5)->get();
        $otherNews = Article::otherNews()->whereNotIn('id', $rightSlider->pluck('id')->merge($leftSlider->pluck('id')))->take(2)->get();
        $otherNewsDown = Article::otherNews()->whereNotIn('id', $rightSlider->pluck('id')->merge($leftSlider->pluck('id'))->merge($otherNews->pluck('id')))->take(8)->get();
        $analyticNews = Article::allAnalytics()->take(4)->get();
        $populars = Article::popular()->take(10)->get();
        $quizzes = Quizze::quizOrderBy();

        // CACHE
        return ['breakingNews' => $breakingNews, 
           'rightSlider'=>  $rightSlider, 
            'leftSlider' => $leftSlider, 
            'shows' => $shows, 
            'blogs' => $blogs, 
            'latestNews' => $latestNews, 
            'otherNews' => $otherNews, 
            'otherNewsDown' => $otherNewsDown, 
            'analyticNews' => $analyticNews,
            'populars' => $populars,
            'quizzes' => $quizzes];
       
    });

    return view('pages/home-page')->with([
        'breakingNews' => $data['breakingNews'], 'rightSlider' => $data['rightSlider'],
        'leftSlider' => $data['leftSlider'], 'shows' => $data['shows'], 'blogs' => $data['blogs'], 'latestNews' => $data['latestNews'],
        'otherNews' => $data['otherNews'], 'otherNewsDown' => $data['otherNewsDown'], 'analyticNews' => $data['analyticNews'],
        'populars' => $data['populars'], 'quizzes' => $data['quizzes']
    ]);
}

【讨论】:

  • 我收到“Doc​​trine\DBAL\Driver\PDOConnection”不允许序列化错误。
  • 除了$quizzes$breakingNews 之外,其他所有人都有get(),所以它可能是这两行之一。
  • 是的,但他们已经进入模型
  • 您将不得不进行一些故障排除以确定它是哪一个。逐一删除查询,将它们替换为虚拟数据,以找出导致错误的原因。
  • 是的,我现在正在尝试,但它在第 66 行,这个“});”在返回视图顶部是否可以通过错误关闭?
猜你喜欢
  • 1970-01-01
  • 2016-06-27
  • 2016-05-19
  • 2012-07-06
  • 2021-02-21
  • 2019-05-24
  • 2011-09-22
  • 2014-04-11
  • 2011-11-07
相关资源
最近更新 更多