人気のPHP WEBアプリケーションフレームワークLaravelのTipsを記録していきます

Laravel の laravel-responsecache で表示を10倍(?) 高速化する

● spatie/laravel-responsecache

laravel-responsecacheは ララベルのミドルウェアとして動作するキャッシュクラスです。 Laravelのルーティングを通る時に動作する( テンプレートファイルの更新すら確認しない)ので とても高速に動作します

1. インストール

composer require spatie/laravel-responsecache

2. 設定ファイルの生成

php artisan vendor:publish --provider="Spatie\ResponseCache\ResponseCacheServiceProvider"

↑ このコマンドを実行すると
/config/responsecache.php ファイルが生成されます。

3. ミドルウェアにセット

キャッシュをミドルウェア(アクセスのたびに自動的に呼び出されるクラス)にセットします。

既存の $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) {
                   // 何かしらの処理
		});
	});

以上でキャッシュは実行されています。
確認してみましょう。

● spatie/laravel-responsecache の動作を確認する。

1. .env の APP_DEBUG=true を確認する

.env の以下の記述があるか確認しましょう

APP_DEBUG=true

2. Laravel の GETメソッドでアクセスできるページへ2回アクセスしてGoogle Chrome でヘッダを見る。

● 管理画面でデータが変更されたときに自動的にキャッシュをクリアする

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にデータを「新規登録」「変更」「削除」したときにキャッシュがクリアされます。

● spatie/laravel-responsecache の効果をベンチマーク

こちらのコマンドで実際に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 ファイルに設定しておき そこで簡単に切り替えられるようにします

.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) {
        ........... 何かしらの処理
	});
});
添付ファイル1
No.1543
07/27 09:42

edit

添付ファイル