laravel - Laravel5.5:在 session 中保存 Provider 数据,避免过载
问题描述
我制作了一个 ServiceProvider 来在多个视图上加载数据。像这样:
View::composer(['components.navigation.main.search','search.*','page-parts.cats','page-parts.categories_menu','page-parts.categories_more','page-parts.cats_top','components.modals.off-category'],function ($view) {
$view->with([
'toplevel_categories' => Category::topLevel()->orderBy('name')->get(),
]);
});
但是在几个 html 页面上,他需要加载多个这些视图,我不想每次都加载 topLevel 类别以避免过载和减少运行时间。
我可以将加载的数据(toplevel_categories)存储在会话中吗?或者处理这个问题的最有效方法是什么?
解决方案
您可以简单地缓存变量并在回调中使用它,例如:
$topLevelCategories = Category::topLevel()->orderBy('name')->get();
View::composer([], function($view) use ($topLevelCategories) {
$view->with([
'toplevel_categories' => $topLevelCategories
}
你甚至可以使用 laravel 本身的缓存机制来保存一个额外的查询,比如缓存 30 分钟(假设同时数据库没有改变):
// Save the categories in the cache or retrieve them from it.
$topLevelCategories = Cache::remember('topLevelCategories', 30, function() {
return Category::topLevel()->orderBy('name')->get();
});
请注意,对于 Laravel 5.8,第二个参数以 SECONDS 为单位,对于 5.7 及以下版本,它以 MINUTES 为单位。
由于您的服务提供者每个请求/生命周期只加载一次,这应该可以解决问题。
推荐阅读
- php - 如何使用 PHP Curl 发布数据?
- bitcoin - 比特币今天仍然容易受到 CVE-2012-2459 攻击吗?
- hadoop - Yarn 容器转换为 RUNNING 状态,但未完成
- qt - (PySide2+anaconda) 通过 QMediaPlayer 播放音频:警告:“无法打开音频设备进行播放。”
- arrays - 我希望在提交表单后取消选中所有复选框,对于另一种形式,应该取消选中反应
- php - Cakephp 2.x PHP 带计算的长运行循环
- python - pytorch 为从 numpy 创建张量做了什么
- node.js - Flutter:更新 Hmac 加密包
- tensorflow-model-garden - 使用 TF2 对象检测 API 创建的精简模型的预处理
- fonts - 3.5" TFT LCD 上位图或光栅化字体位图和文本显示的差异