お疲れ様です。ギークフィードエンジニアのサミーラです。私は一年ぐらい前からLaravelフレームワークでWEBシステム開発をしています。
Laravelによるプロジェクトの経験
- 通話録音システムの制御および表示Webシステム
- モバイルゲームのバックエンドシステム
- WEB電話帳システム
- IP-PBXのWEBプロビジョニングシステム。
目次
Introduction
今回はLaravelシステムのパフォーマンス向上について話したいと思います。どのエンドユーザーでもレスポンスのために長く待たなければならないときにシステムを嫌います。それで、システムのパフォーマンスは大事な役割をします。laravelは管理的な機能が多いフレームワークであるため、laravelシステムのパフォーマンス向上はそれほど難しくはありません。Laravelシステムのパフォーマンスを向上するための3つの方法について説明します。
これらはlaravelの基本的な知識で行うことができます。
- レスポンス向上 => Cacheの設定
- DBからデータを取得する際にメモリに負荷をかけない => データベースチャンキング
- blade、HTMLの表示速度向上 => Laravel Page Speedパッケージ
Cacheの設定
Cachingとは、前処理されたデータまたはデータストアからのデータを保存することです。これにより、そのデータに対する今後のリクエストをより迅速に処理できます。Laravelのパフォーマンス向上に関する、cacheの点2つについて説明します。
Config Cache
LaravelのConfig cacheはLaravelのconfigをロードするのを高速化するために、cacheファイルを作る機能です。Laravelのconfigディレクトリに下に複数のconfigファイルがあります。Config cacheを使って、全てのconfigファイルを1つのconfigファイルにまとめることができます。 以下のartisanコマンドでconfigの詳細が表示されます。
1 |
php artisan config:cache -h |
上のconfig:cacheコマンドに関するファイルは「Illuminate/Foundation/Console/ConfigCacheCommand」です。必要であれば、そのファイルの「handle」メソッドを見ればコマンドの動きがわかります。
コマンドの動きがわかる必要がありませけど、以下のコマンドで全てのconfigを含めている「/bootstrap/cache/config.php」を作れます。Laravelはそのファイルを使って、configをロードするので、パフォーマンス向上になります。
1 |
php artisan config:cache |
ここで覚えておく必要があるのは、設定ファイル(.config)でしかenv()メソッドを使用できなくなるということです。他のところ(Controllerなど)でconfigの値を使うなら、config()メソッドを使うようにする必要があります。原因として、もしconfig:cacheコマンドが実行したら、env()メソッドが.envファイルを読むことができなくからです。
Route Cache
LaravelnのRoutingは遅いプロセスです。laravelルーティングには、登録ルート、マッピングコントローラークラス、アクション、ミドルウェア、APIまたはWebへのルートの一致が含まれます。LaravelのRoute cacheはLaravelのrouteを処理するのを高速化するために、cacheファイルを作る機能です。それで、リクエストごとにいろいろな処理をする必要がなくなります。以下のartisanコマンドでconfigの詳細が表示されます。
1 |
php artisan route:cache -h |
上のroute:cacheコマンドに関するファイルは「Illuminate/Foundation/Console/RouteCacheCommand」です。必要であれば、そのファイルの「handle」メソッドを見ればコマンドの動きがわかります。
以下のコマンドで全てのrouteを含めている「/bootstrap/cache/routes.php」を作ります。Laravelはそのファイルを使って、routesをロードするので、パフォーマンス向上になります。
1 |
php artisan route:cache |
route cachingには制限があります。それは、「laravelのroute cachingを使用する場合、routeにclosureを含めることはできない」ということです。
例:
laravelのrouteは「routes/api.php」と「routes/web.php」に入っています。そのファイルに以下のようなroutesが入れることができません。
1 2 3 |
Route::middleware('auth:api')->get('/user', function (Request $request){ return $request->user(); }); |
全てのroutesは以下の形にする必要があります。
1 |
Route::middleware('auth:api')->get('/user', 'SomeController@method'); |
データベースチャンキング
システム開発するときにデータベースから大量のデータをロードし、それらのデータに対して何らかの操作をする必要があります。例えば「レポート生成、通知送信」。そういう状況でサーバーのPHPのメモリ足りなくなるし、システムが遅くなる可能性があります。データベースチャンキングは、このような状況で使用できる優れたオプションです。
例を見てみましょう。30万数のレコードのデータセットを持つデータベーステーブルcommentsがあると考えてください。そのテーブルの全てのレコードを取得して、レポート生成したいとのことだったら、
以下のソースコードでデータを取得するとphpのmemory limitのエラーが発生、もしくはシステム遅くなる可能性があります。
1 2 3 4 5 6 |
Route::get('/get_comments', function(){ $comments = \App\Comments::all(); foreach($comments as $cmnt){ //コメントでレポート生成 } }); |
上の状況だったら、以下のソースコードのようにデータベースチャンキングを使ったらphpのmemory limitのエラー、もしくはシステム遅くなる可能性がなくなります。
1 2 3 4 5 6 7 |
Route::get('/get_comments', function(){ \App\Comments::chunk(10000,function($comments){ foreach($comments as $cmnt){ //コメントでレポート生成 } }); }); |
上のソースコードによると、DBは30回アクセスされ、一度に10000レコードを取得します。それで、システムのパフォーマンス向上にすることができます。
Laravel Page Speedパッケージ
Laravel Page SpeedはLaravelのhtmlファイルを最適化するパッケージです。それは「余分な新しい行、空行、コメント、htmlタグのいらないattributes」を削除してから、ウェブページを表示します。
パッケージのlink: Laravel Page Speed
パッケージのホームページに行くとインストールする方法は書いてありますので、簡単にインストールできます。ここで知っておくべきことの1つは、パッケージのミドルウェア設定についてです。ミドルウェアを「protected $middleware」配列の内に入れると、すべてのroutes(webとapi)がページのサイズを小さくします。でも、apiのroutesの場合はページのサイズを小さくする必要はありません。そうしたら、page speedパッケージのミドルウェアを「protected $middlewareGroups 」のweb配列の中に入れたほうがいいと思います。そこに入れるとwebのroutesの場合しかページのサイズを小さくしません。
あと、ページの縮小操作は特定のroutesの場合のみ使うんだったら、以下の方法を使えます。
「app\http\Kernel.php」の「protected $middlewareGroups」配列の中に以下の配列を入れる。
1 2 3 4 5 6 7 8 9 |
'pagespeed' => [ \RenatoMarinho\LaravelPageSpeed\Middleware\InlineCss::class, \RenatoMarinho\LaravelPageSpeed\Middleware\ElideAttributes::class, \RenatoMarinho\LaravelPageSpeed\Middleware\InsertDNSPrefetch::class, \RenatoMarinho\LaravelPageSpeed\Middleware\RemoveComments::class, \RenatoMarinho\LaravelPageSpeed\Middleware\TrimUrls::class, \RenatoMarinho\LaravelPageSpeed\Middleware\RemoveQuotes::class, \RenatoMarinho\LaravelPageSpeed\Middleware\CollapseWhitespace::class, ] |
その後、新しく作ったミドルウェアを必要なrouteで使えます。
1 |
Route::get('/welcome', 'SomeController@method')->middleware('pagespeed'); |
上のソースコードだと「/welcome」というrouteのみ、ページの縮小になります。他にはそのままです。
まとめ
システムのパフォーマンスは重要なポイントです。laravelシステムのパフォーマンス向上させる方法はたくさんあります。
ここでは、3つのポイントについて説明しました。
- Cacheの設定 => システム開発後、configとrouteをcachingして、パフォーマンス向上させる方法。
- データベースチャンキング => 大量のデータがある場合、データベースから部分的にデータを取得する方法。
- Laravel Page Speedパッケージ => ページの縮小操作をして、htmlページの表示のパフォーマンス向上させる方法。
ALL THE BEST!!! HAPPY & CLEAN CODING!!!
- SupervisorでLaravelのQueue worker管理 - 2021-07-27
- Laravelでバックグラウンド処理。。。 - 2021-03-22
- NATファイアウォール背後のサーバーをZabbixで監視するTips - 2020-09-09
- Laravelのパフォーマンスを向上しましょう - 2019-12-02
- Laravelのサービスプロバイダーの仕組みやメリットとは - 2019-09-04