knovator / laravel-model-caching
Eloquent模型的自动缓存。
Requires
- php: >=7.2.5
- predis/predis: ^1.1
Requires (Dev)
- fzaninotto/faker: ^1.9
- orchestra/testbench: ^5.0
- orchestra/testbench-browser-kit: ^5.0
- php-coveralls/php-coveralls: ^2.2
- phpmd/phpmd: ^2.7
- phpunit/phpunit: ^8.0
- sebastian/phpcpd: ^5.0
- squizlabs/php_codesniffer: ^3.4
- symfony/thanks: ^1.2
This package is not auto-updated.
Last update: 2024-09-29 15:40:52 UTC
README
支持此包
这是一个MIT许可的开源项目,其持续发展是由社区的支持得以实现的。如果您想支持这个,以及我们的其他包,请考虑成为赞助者。
动力
我创建了这个包是为了响应一个客户项目,该项目中有复杂的嵌套表单,包含许多
特性
- 自动、自我失效的关系(仅预加载)缓存。
- 自动、自我失效的模型查询缓存。
- 自动使用支持它们的缓存提供程序的缓存标签(对于不支持它们的提供程序将刷新整个缓存)。
缓存驱动器
此包最适合可标记的缓存驱动器
+ Redis + MemCached + APC + Array
它将不与非标记驱动器一起工作
- Database - File - DynamoDB
要求
- Laravel 6.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.
可能冲突的包
任何覆盖Model类中的newEloquentModel()的包都可能与该包冲突。当然,任何实现自己的QueryBuilder类的包实际上绕过了此包,使它们不兼容。
以下是我们已确定的不兼容的包
- grimzy/laravel-mysql-spatial
- fico7489/laravel-pivot
- chelout/laravel-relationship-events
- spatie/laravel-query-builder
- dwightwatson/rememberable
目前不工作的事情
以下项目目前不与此包一起工作
- 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/knovator/laravel-model-caching/issues/305).
安装
在要求它时,请确保不要要求此包的特定版本
composer require knovator/laravel-model-caching:*
升级说明
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 Knovator\LaravelModelCaching\Traits\Cachable; abstract class BaseModel { use Cachable; // }
多个数据库连接
感谢@dtvmedia建议此功能。这实际上是一个比缓存前缀更健壮的解决方案。
为多个数据库连接保留不同的密钥会自动处理。这对于多租户应用尤为重要,当然,任何使用多个数据库连接的应用也是如此。
可选的缓存键前缀
感谢 @lucian-dragomir 建议这个特性!您可以使用缓存键前缀来为多租户应用保留不同的缓存条目。为此,建议将可缓存特性添加到基模型中,然后在该处设置缓存键前缀配置值。
以下是一个示例
<?php namespace Knovator\LaravelModelCaching\Tests\Fixtures; use Knovator\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 });
建议:在所有您的种子查询中使用选项 #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 警告。
