vheins / laravel-model-caching
Eloquent 模型的自动缓存。
Requires
- php: ^8.1
- genealabs/laravel-pivot-events: ^10.0
- illuminate/cache: ^10.0
- illuminate/config: ^10.0
- illuminate/console: ^10.0
- illuminate/container: ^10.0
- illuminate/database: ^10.0
- illuminate/http: ^10.0
- illuminate/support: ^10.0
Requires (Dev)
- doctrine/dbal: ^3.3
- fakerphp/faker: ^1.11
- laravel/legacy-factories: ^1.3
- laravel/nova: ^3.9
- orchestra/testbench: ^8.0
- orchestra/testbench-browser-kit: ^8.0
- php-coveralls/php-coveralls: ^2.2
- phpmd/phpmd: ^2.11
- phpunit/phpunit: ^9.5
- slevomat/coding-standard: ^7.0
- squizlabs/php_codesniffer: ^3.6
- symfony/thanks: ^1.2
This package is auto-updated.
Last update: 2024-09-26 18:12:09 UTC
README
支持此包
这是一个 MIT 许可的开源项目,其持续发展得益于社区的赞助。如果您想支持这个项目,以及其他项目,请考虑成为赞助者。
我们感谢以下赞助者的慷慨,请花点时间了解他们
Impetus
我创建这个包是为了响应一个客户项目,该项目的表单复杂、嵌套,包含许多 <select>
,导致一个页面上有超过 700 次数据库查询。我需要一个可以抽象出模型中缓存过程的包,并且可以让我缓存自定义查询以及模型关系。这个包试图满足这些需求。
特性
- 自动、自验证的关系(仅预加载)缓存。
- 自动、自验证的模型查询缓存。
- 对于支持标签的缓存提供者,自动使用缓存标签(对于不支持标签的提供者将清除整个缓存)。
缓存驱动程序
此包最适合可标签的缓存驱动程序
+ Redis + MemCached + APC + Array
它将无法与非标签驱动程序一起工作
- Database - File - DynamoDB
要求
- PHP 7.3+
- Laravel 8.0+
- Please note that prior Laravel versions are not supported and the package - versions that are compatible with prior versions of Laravel contain bugs. - Please only use with the versions of Laravel noted above to be compatible.
可能的包冲突
任何覆盖 newEloquentModel()
的 Model
类的包都可能与此包冲突。当然,任何实现自己的 Querybuilder 类的包实际上绕过了此包,使其不兼容。
以下是我们已识别出冲突的包
- grimzy/laravel-mysql-spatial
- fico7489/laravel-pivot
- chelout/laravel-relationship-events
- spatie/laravel-query-builder
- dwightwatson/rememberable
- kalnoy/nestedset
目前不工作的事项
以下项目目前与此包不兼容
- caching of lazy-loaded relationships, see #127. Currently lazy-loaded belongs-to relationships are cached. Caching of other relationships is in the works. - using select() clauses in Eloquent queries, see #238 (work-around discussed in the issue) - using transactions. If you are using transactions, you will likely have to manually flush the cache, see [issue #305](https://github.com/GeneaLabs/laravel-model-caching/issues/305).
安装
确保在需要时不要要求指定此包的特定版本
composer require genealabs/laravel-model-caching
使用 Lumen 时的注意事项
以下步骤需要您自行解决并在您的 Lumen 应用程序中实现。通过谷歌搜索可以找到实现这些功能的各种方法。
- 在 Lumen 中注册包
$app->register(GeneaLabs\LaravelModelCaching\Providers\Service::class);
- 确保您的 Lumen 应用程序可以加载配置文件。
- 将此包的配置文件发布到您的应用程序加载配置文件的位置。
升级说明
0.6.0
禁用此包的环境和配置变量已更改。
-
如果您以前已发布配置文件,请再次发布并相应调整。
php artisan modelCache:publish --config
-
如果您在 .env 文件中禁用了此包,将条目从
MODEL_CACHE_DISABLED=true
更改为MODEL_CACHE_ENABLED=false
。
0.5.0
以下实现已更改(请参阅各自的章节)
- 特定于模型的缓存前缀
配置
推荐(可选)自定义缓存存储
如果您想使用 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; protected $cachePrefix = "test-prefix"; }
您还可以在配置中设置缓存前缀,以在整个应用程序中为所有缓存的模型添加前缀
'cache-prefix' => 'test-prefix',
异常:用户模型
我不建议缓存用户模型,因为它是特殊情况,因为它扩展了Illuminate\Foundation\Auth\User
。覆盖它可能会破坏功能。不仅如此,缓存用户模型可能也不是一个好主意,因为您总是希望获取有关它的最新信息。
实验性:在特定模型中缓存冷却
在某些情况下,您可能希望为缓存失效添加一个冷却期。例如,您可能有一个繁忙的网站,其中评论提交速度很高,您不希望每次提交评论都使缓存失效。虽然我不一定推荐这样做,但您可能想试验一下它的效果。
要使用它,必须在模型中启用(或如果要在多个或所有模型中使用,则在基模型中启用)
class MyModel extends Model { use Cachable; protected $cacheCooldownSeconds = 300; // 5 minutes // ... }
之后它可以在查询中实现
(new Comment) ->withCacheCooldownSeconds(30) // override default cooldown seconds in model ->get();
或者
(new Comment) ->withCacheCooldownSeconds() // use default cooldown seconds in model ->get();
禁用查询的缓存
有两种方法可以禁用模型缓存
- 在按查询实例使用
->disableCache()
。 - 在您的
.env
文件中设置MODEL_CACHE_ENABLED=false
。 - 如果您只需要禁用代码块或非eloquent查询的缓存,这可能是更好的选择
$result = app("model-cache")->runDisabled(function () { return (new MyModel)->get(); // or any other stuff you need to run with model-caching disabled });
建议:在所有seeder查询中使用选项#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中包含全面的文档。
- ✅ 提供最新的CHANGELOG.md,该文档符合https://keepachangelog.com中概述的格式。
- ✅ 所有代码中均无PHPMD或PHPCS警告。
贡献
请遵守和尊重包含的《行为准则》的各个方面https://github.com/GeneaLabs/laravel-model-caching/blob/master/CODE_OF_CONDUCT.md。
报告问题
在报告问题时,请尽可能完整地填写包含的模板。信息不完整的问题可能会被忽略或关闭,因为没有足够的信息来采取行动。
提交Pull Requests
请查阅《贡献指南》https://github.com/GeneaLabs/laravel-model-caching/blob/master/CONTRIBUTING.md。只有符合所有标准的Pull Requests才会被接受。
如果你喜欢开源软件,给你的使用过的仓库点一个 ⭐️。
我们已将令人惊叹的symfony/thanks
composer包作为开发依赖项包含在内。通过在你使用的包上点星,让你的操作系统包维护者知道你感激他们。(不必担心,因为这个是开发依赖项,它不会安装在你的生产环境中。)只需在安装此包后运行composer thanks即可。