laravel-responsecacheは ララベルのミドルウェアとして動作するキャッシュクラスです。 Laravelのルーティングを通る時に動作する( テンプレートファイルの更新すら確認しない)ので とても高速に動作します
composer require spatie/laravel-responsecache
php artisan vendor:publish --provider="Spatie\ResponseCache\ResponseCacheServiceProvider"
↑ このコマンドを実行すると
/config/responsecache.php ファイルが生成されます。
キャッシュをミドルウェア(アクセスのたびに自動的に呼び出されるクラス)にセットします。
既存の $routeMiddleware の一番最後に追加します。
app/Http/Kernel.php
protected $routeMiddleware = [
...
'cacheResponse' => \Spatie\ResponseCache\Middlewares\CacheResponse::class, // 追加
'doNotCacheResponse' => \Spatie\ResponseCache\Middlewares\DoNotCacheResponse::class, // 追加
];
次に routes/web.php のキャッシュを適応したいルートをこちらのミドルウェアで囲みます。
Route::group(['middleware' => 'cacheResponse'], function () {
Route::get("/", function (Request $request) {
// 何かしらの処理
});
});
以上でキャッシュは実行されています。
確認してみましょう。
.env の以下の記述があるか確認しましょう
APP_DEBUG=true
app/ResponsecacheTrait.php を以下の内容で新規作成します
<?php
namespace App;
use Spatie\ResponseCache\Facades\ResponseCache;
trait ResponsecacheTrait
{
public static function bootClearsResponseCache()
{
self::created(function () {
ResponseCache::clear();
});
self::updated(function () {
ResponseCache::clear();
});
self::deleted(function () {
ResponseCache::clear();
});
}
}
Laravelアプリで使用する全てのモデルファイルに以下のトレイトを追加します
例 : app/news.php に追加します
class News extends Model
{
// ===== Trait =====
use \App\ResponsecacheTrait; // ● 追加
// ===== Trait =====
これで DBにデータを「新規登録」「変更」「削除」したときにキャッシュがクリアされます。
こちらのコマンドで実際にWEBアプリのベンチマークを3回ずつとってみたところ
ab -n 100 -c 100 https://TEST-SITE.TLD/
Requests per second: 9.19 [#/sec] (mean)
Requests per second: 7.54 [#/sec] (mean)
Requests per second: 6.50 [#/sec] (mean)
↓
Requests per second: 80.19 [#/sec] (mean)
Requests per second: 73.79 [#/sec] (mean)
Requests per second: 76.89 [#/sec] (mean)
約9.9倍 速くなりました !!
開発時にこのミドルウェアが入っていると 一時的にキャッシュをオンにしたりオフにしたり する必要が出てきますそこで設定を .env ファイルに設定しておき そこで簡単に切り替えられるようにします
.env
RESPONSE_CACHE_FLAG=true
routes/web.php
// キャッシュミドルウェア( .env の RESPONSE_CACHE_FLAG が true の場合 キャッシュ on)
$cache_middleware = [];
if ( env('RESPONSE_CACHE_FLAG',false) == true ){
$cache_middleware = ['middleware' => 'cacheResponse'];
}
Route::group($cache_middleware, function () {
Route::get("/", function (Request $request) {
........... 何かしらの処理
});
});