testingap/laravel-model-caching
Composer 安装命令:
composer require testingap/laravel-model-caching
包简介
Automatic caching for Eloquent models.
README 文档
README
Model Caching for Laravel
Impetus
I created this package in response to a client project that had complex, nested
forms with many <select>'s that resulted in over 700 database queries on one
page. I needed a package that abstracted the caching process out of the model
for me, and one that would let me cache custom queries, as well as cache model
relationships. This package is an attempt to address those requirements.
Features
- automatic, self-invalidating relationship (only eager-loading) caching.
- automatic, self-invalidating model query caching.
- automatic use of cache tags for cache providers that support them (will flush entire cache for providers that don't).
Requirements
- PHP >= 7.1.3
- Laravel 5.4 - 5.7
Possible Conflicting Packages
Any packages that also override newEloquentModel() from the Model class will
likely conflict with this package. So far these may include the following:
Installation
composer require genealabs/laravel-model-caching
Configuration
Recommended (Optional) Custom Cache Store
If you would like to use a different cache store than the default one used by
your Laravel application, you may do so by setting the MODEL_CACHE_STORE
environment variable in your .env file to the name of a cache store configured
in config/cache.php (you can define any custom cache store based on your
specific needs there). For example:
MODEL_CACHE_STORE=redis2
Usage
For best performance a taggable cache provider is recommended (redis, memcached). While this is optional, using a non-taggable cache provider will mean that the entire cache is cleared each time a model is created, saved, updated, or deleted.
For ease of maintenance, I would recommend adding a BaseModel model that
uses Cachable, from which all your other models are extended. If you
don't want to do that, simply extend your models directly from CachedModel.
Here's an example BaseModel class:
<?php namespace App; use GeneaLabs\LaravelModelCaching\Traits\Cachable; abstract class BaseModel { use Cachable; // }
Multiple Database Connections
Thanks to @dtvmedia for suggestion this feature. This is actually a more robust solution than cache-prefixes.
Keeping keys separate for multiple database connections is automatically handled. This is especially important for multi-tenant applications, and of course any application using multiple database connections.
Optional Cache Key Prefix
Thanks to @lucian-dragomir for suggesting this feature! You can use cache key prefixing to keep cache entries separate for multi-tenant applications. For this it is recommended to add the Cachable trait to a base model, then set the cache key prefix config value there.
Note that the config setting is included before the parent method is called, so that the setting is available in the parent as well. If you are developing a multi-tenant application, see the note above.
Here's is an example:
<?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); } }
Exception: User Model
I would not recommend caching the user model, as it is a special case, since it
extends Illuminate\Foundation\Auth\User. Overriding that would break functionality.
Not only that, but it probably isn't a good idea to cache the user model anyway,
since you always want to pull the most up-to-date info on it.
Experimental: Cache Cool-down In Specific Models
In some instances, you may want to add a cache invalidation cool-down period. For example you might have a busy site where comments are submitted at a high rate, and you don't want every comment submission to invalidate the cache. While I don't necessarily recommend this, you might experiment it's effectiveness.
It can be implemented like so:
(new Comment) ->withCacheCooldownSeconds(30) ->get();
Disabling Caching of Queries
There are two methods by which model-caching can be disabled:
- Use
->disableCache()in a query-by-query instance. - Set
MODEL_CACHE_DISABLED=TRUEin your.envfile.
Recommendation: use option #1 in all your seeder queries to avoid pulling in
cached information when reseeding multiple times.
You can disable a given query by using disableCache() anywhere in the query chain. For example:
$results = $myModel->disableCache()->where('field', $value)->get();
Manual Flushing of Specific Model
You can flush the cache of a specific model using the following artisan command:
php artisan modelCache:clear --model=App\Model
This comes in handy when manually making updates to the database. You could also trigger this after making updates to the database from sources outside your Laravel app.
Possible Future Improvements
Summary
That's all you need to do. All model queries and relationships are now cached!
In testing this has optimized performance on some pages up to 900%! Most often you should see somewhere around 100% performance increase.
Commitment to Quality
During package development I try as best as possible to embrace good design and development practices, to help ensure that this package is as good as it can be. My checklist for package development includes:
- ✅ Achieve as close to 100% code coverage as possible using unit tests.
- ✅ Eliminate any issues identified by SensioLabs Insight and Scrutinizer.
- ✅ Be fully PSR1, PSR2, and PSR4 compliant.
- ✅ Include comprehensive documentation in README.md.
- ✅ Provide an up-to-date CHANGELOG.md which adheres to the format outlined at http://keepachangelog.com.
- ✅ Have no PHPMD or PHPCS warnings throughout all code.
Contributing
Please observe and respect all aspects of the included Code of Conduct https://github.com/GeneaLabs/laravel-model-caching/blob/master/CODE_OF_CONDUCT.md.
Reporting Issues
When reporting issues, please fill out the included template as completely as possible. Incomplete issues may be ignored or closed if there is not enough information included to be actionable.
Submitting Pull Requests
Please review the Contribution Guidelines https://github.com/GeneaLabs/laravel-model-caching/blob/master/CONTRIBUTING.md. Only PRs that meet all criterium will be accepted.
❤️ Open-Source Software - Give ⭐️
We have included the awesome symfony/thanks composer package as a dev
dependency. Let your OS package maintainers know you appreciate them by starring
the packages you use. Simply run composer thanks after installing this package.
(And not to worry, since it's a dev-dependency it won't be installed in your
live environment.)
testingap/laravel-model-caching 适用场景与选型建议
testingap/laravel-model-caching 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 3 次下载、GitHub Stars 达 0, 最近一次更新时间为 2018 年 12 月 13 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 testingap/laravel-model-caching 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 testingap/laravel-model-caching 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 3
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 1
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2018-12-13

