jocoonopa / laravel-model-caching
Eloquent 模型的自动缓存。
此包的规范存储库似乎已消失,因此该包已被冻结。
Requires
- php: ^7.3|^8.0
- genealabs/laravel-pivot-events: ^8.0
- illuminate/cache: ^8.0
- illuminate/config: ^8.0
- illuminate/console: ^8.0
- illuminate/container: ^8.0
- illuminate/database: ^8.0
- illuminate/http: ^8.0
- illuminate/support: ^8.0
Requires (Dev)
- doctrine/dbal: ^2.10
- fakerphp/faker: ^1.11
- laravel/legacy-factories: ^1.0
- laravel/nova: ^3.9
- orchestra/testbench: ^6.0
- orchestra/testbench-browser-kit: ^6.0
- php-coveralls/php-coveralls: ^2.2
- phpmd/phpmd: ^2.7
- phpunit/phpunit: ^9.0
- slevomat/coding-standard: ^6.4
- squizlabs/php_codesniffer: ^3.4
- symfony/thanks: ^1.2
- dev-master
- 0.11.16
- 0.11.5
- 0.11.4
- 0.11.3
- 0.11.2
- 0.11.1
- 0.11.0
- 0.10.2
- 0.10.1
- 0.10.0
- 0.9.0
- 0.8.10
- 0.8.9
- 0.8.8
- 0.8.7
- 0.8.6
- 0.8.5
- 0.8.4
- 0.8.3
- 0.8.2
- 0.8.1
- 0.8.0
- 0.7.4
- 0.7.3
- 0.7.2
- 0.7.1
- 0.7.0
- 0.6.3
- 0.6.2
- 0.6.1
- 0.6.0
- 0.5.6
- 0.5.5
- 0.5.4
- 0.5.3
- 0.5.2
- 0.5.1
- 0.5.0
- 0.4.24
- 0.4.23
- 0.4.22
- 0.4.21
- 0.4.20
- 0.4.19
- 0.4.18
- 0.4.17
- 0.4.16
- 0.4.15
- 0.4.14
- 0.4.13
- 0.4.12
- 0.4.11
- 0.4.10
- 0.4.9
- 0.4.8
- 0.4.7
- 0.4.6
- 0.4.5
- 0.4.4
- 0.4.3
- 0.4.2
- 0.4.1
- 0.4.0
- 0.3.7
- 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-dependabot/add-v2-config-file
- dev-dependabot/composer/slevomat/coding-standard-tw-7.0
- dev-feature/implement-query-builder-override-fix
- dev-develop
- dev-feature/allow-flushing-by-database
- dev-feature/add-nova-tests
- dev-feature/update-to-laravel-6
- dev-feature/performance-improvements
- dev-laravel-5.5
- dev-laravel-5.6
This package is auto-updated.
Last update: 2022-01-14 11:15:40 UTC
README
支持此包
这是一个 MIT 许可的开源项目,其持续开发得益于社区的资助。如果您想支持该项目以及我们的其他包,请考虑成为赞助商。
动机
我创建了这个包是为了响应一个客户项目,该项目中有复杂嵌套表单,包含许多 <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()
的包都将可能与该包冲突。当然,任何实现自己的 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 应用程序中实施。Google 提供了各种方法来实现这一点。
- 将包注册到 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 });
建议:在所有种子查询中使用选项#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 中包含全面的文档。
- ✅ 提供符合 https://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 包作为开发依赖项包含在内。通过为使用的包评分,让您的操作系统包维护者知道您对他们的感激之情。只需在安装此包后运行 composer thanks 即可。(不必担心,由于它是开发依赖项,它不会安装到您的生产环境中。)