testingap / laravel-model-caching
为Eloquent模型提供自动缓存。
Requires
- php: >=7.1.3
- fico7489/laravel-pivot: dev-new@dev
- illuminate/cache: 5.4 - 5.7
- illuminate/config: 5.4 - 5.7
- illuminate/console: 5.4 - 5.7
- illuminate/database: 5.4 - 5.7
- illuminate/support: 5.4 - 5.7
Requires (Dev)
- codedungeon/phpunit-result-printer: ^0.23.4
- fzaninotto/faker: *
- mockery/mockery: *
- orchestra/database: 3.7.x-dev@dev
- orchestra/testbench: 3.7.*
- orchestra/testbench-browser-kit: 3.7.*
- php-coveralls/php-coveralls: *
- phpmd/phpmd: *
- phpunit/phpunit: 7.*
- predis/predis: *
- sebastian/phpcpd: *
- symfony/thanks: *
- dev-master
- 0.3.6
- 0.3.5
- 0.3.4
- 0.3.3
- 0.3.2
- 0.3.1
- 0.3.0
- 0.2.64
- 0.2.63
- 0.2.62
- 0.2.61
- 0.2.60
- 0.2.59
- 0.2.58
- 0.2.57
- 0.2.56
- 0.2.55
- 0.2.54
- 0.2.53
- 0.2.52
- 0.2.51
- 0.2.50
- 0.2.49
- 0.2.48
- 0.2.47
- 0.2.46
- 0.2.45
- 0.2.44
- 0.2.43
- 0.2.42
- 0.2.41
- 0.2.40
- 0.2.39
- 0.2.38
- 0.2.37
- 0.2.36
- 0.2.35
- 0.2.34
- 0.2.33
- 0.2.32
- 0.2.31
- 0.2.30
- 0.2.29
- 0.2.28
- 0.2.27
- 0.2.26
- 0.2.25
- 0.2.24
- 0.2.23
- 0.2.22
- 0.2.21
- 0.2.20
- 0.2.19
- 0.2.18
- 0.2.17
- 0.2.16
- 0.2.15
- 0.2.14
- 0.2.13
- 0.2.12
- 0.2.11
- 0.2.10
- 0.2.9
- 0.2.8
- 0.2.7
- 0.2.6
- 0.2.5
- 0.2.4
- 0.2.3
- 0.2.2
- 0.2.1
- 0.2.0
- 0.1.0
- dev-develop
- dev-feature/performance-improvements
- dev-laravel-5.5
- dev-laravel-5.6
This package is auto-updated.
Last update: 2024-09-29 03:52:46 UTC
README
Laravel模型缓存
动机
我创建了这个包是为了响应一个客户项目,该项目中包含复杂的嵌套表单,有多个<select>
,导致一个页面上有超过700次数据库查询。我需要一个可以将缓存过程从模型中抽象出来的包,以及一个可以让我缓存自定义查询和模型关系的包。这个包旨在满足这些需求。
特性
- 自动、自失效的关系(仅预加载)缓存。
- 自动、自失效的模型查询缓存。
- 自动使用支持缓存标签的缓存提供者(对于不支持缓存标签的提供者将刷新整个缓存)。
要求
- PHP >= 7.1.3
- Laravel 5.4 - 5.7
可能冲突的包
任何覆盖Model
类中的newEloquentModel()
的包都可能与此包冲突。迄今为止,这些可能包括以下包
安装
composer require genealabs/laravel-model-caching
配置
推荐(可选)自定义缓存存储
如果您想使用与您的Laravel应用程序默认使用的缓存存储不同的缓存存储,您可以通过在.env
文件中将MODEL_CACHE_STORE
环境变量设置为在config/cache.php
中配置的缓存存储名称来实现。例如
MODEL_CACHE_STORE=redis2
使用方法
为了获得最佳性能,建议使用可标记的缓存提供者(redis、memcached)。虽然这是可选的,但使用非标记的缓存提供者将意味着每次创建、保存、更新或删除模型时都会清除整个缓存。
为了便于维护,我建议添加一个使用Cachable
的BaseModel
模型,然后从该模型扩展所有其他模型。如果您不想这样做,只需直接从CachedModel
扩展您的模型。
以下是一个BaseModel
类的示例
<?php namespace App; use GeneaLabs\LaravelModelCaching\Traits\Cachable; abstract class BaseModel { use Cachable; // }
多个数据库连接
感谢@dtvmedia建议此功能。这实际上是一个比缓存前缀更健壮的解决方案。
自动处理多个数据库连接的键分离。这对于多租户应用程序非常重要,当然对于使用多个数据库连接的应用程序也是如此。
可选的缓存键前缀
感谢@lucian-dragomir建议此功能!您可以使用缓存键前缀来保持多租户应用程序的缓存条目分离。为此,建议将Cachable特性添加到基模型中,然后在该处设置缓存键前缀配置值。
请注意,配置设置是在调用父方法之前包含的,因此设置也在父方法中可用。如果您正在开发多租户应用程序,请参阅上面的注释。
以下是一个示例
<?php namespace GeneaLabs\LaravelModelCaching\Tests\Fixtures; use GeneaLabs\LaravelModelCaching\Traits\Cachable; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class BaseModel extends Model { use Cachable; public function __construct($attributes = []) { config(['laravel-model-caching.cache-prefix' => 'test-prefix']); parent::__construct($attributes); } }
异常:用户模型
我不建议缓存用户模型,因为它是一个特殊情况,因为它扩展了Illuminate\Foundation\Auth\User
。覆盖它将破坏功能。不仅如此,缓存用户模型可能也不是一个好主意,因为您始终希望获取最新的信息。
实验性:特定模型中的缓存冷却
在某些情况下,您可能需要添加缓存失效冷却期。例如,您可能有一个繁忙的网站,评论提交率很高,您不希望每次评论提交都使缓存失效。虽然我并不一定推荐这样做,但您可以尝试测试其有效性。
它可以这样实现
(new Comment) ->withCacheCooldownSeconds(30) ->get();
禁用查询缓存
可以通过两种方法禁用模型缓存
- 在按查询实例中使用
->disableCache()
。 - 在您的
.env
文件中设置MODEL_CACHE_DISABLED=TRUE
。
建议:在所有您的种子查询中使用选项 #1,以避免在多次重新种植时拉入缓存信息。 您可以通过在查询链中的任何位置使用 disableCache()
来禁用特定的查询。例如
$results = $myModel->disableCache()->where('field', $value)->get();
手动清除特定模型
您可以使用以下 artisan 命令清除特定模型的缓存
php artisan modelCache:clear --model=App\Model
当您手动更新数据库时,这非常有用。您也可以在从 Laravel 应用程序外部的来源对数据库进行更新后触发此操作。
可能的未来改进
总结
这就是您需要做的。所有模型查询和关系现在都已缓存!
在测试中,这已经使某些页面的性能优化高达 900%!您通常应该看到大约 100% 的性能提升。
对质量的承诺
在包开发过程中,我会尽最大努力采用良好的设计和开发实践,以确保这个包尽可能好。我的包开发清单包括
- ✅ 使用单元测试尽可能实现接近 100% 的代码覆盖率。
- ✅ 消除 SensioLabs Insight 和 Scrutinizer 识别的所有问题。
- ✅ 完全符合 PSR1、PSR2 和 PSR4。
- ✅ 在 README.md 中包含全面的文档。
- ✅ 提供符合 http://keepachangelog.com 中概述格式的最新 CHANGELOG.md。
- ✅ 在所有代码中没有任何 PHPMD 或 PHPCS 警告。
贡献
请遵守并尊重包含的《行为准则》的所有方面 https://github.com/GeneaLabs/laravel-model-caching/blob/master/CODE_OF_CONDUCT.md。
报告问题
在报告问题时,请尽可能完整地填写包含的模板。不完整的问题可能会被忽略或关闭,因为没有足够的信息来采取行动。
提交拉取请求
请查看《贡献指南》 https://github.com/GeneaLabs/laravel-model-caching/blob/master/CONTRIBUTING.md。只有符合所有标准的 PR 才会被接受。
❤️ 开源软件 - 给 ⭐️
我们已经将惊人的 symfony/thanks
composer 包作为一个开发依赖项包含在内。通过给使用您的包的 OS 包维护者打星来告诉他们您很感激他们。只需在安装此包后运行 composer thanks 即可。(而且不用担心,因为它是一个开发依赖项,所以它不会安装到您的实时环境中。)