TOP テクノロジーLaravel Performance Optimization_ WEBのページ表示速度改善方法

Performance Optimization_ WEBのページ表示速度改善方法

by Mai Tran


あるウェブサイトにアクセスする時、ページの表示に非常に遅くて我慢して待ちますでしょうか。そんなことはありませんね。Googleの調査したデータによると、ページの表示が3秒以上掛かったサイトに対してユーザーは待たずに、サイトから離れる率が53%を超えるようです。というわけで、ウェブページに生き残り要素として一番大切なことはページ表示速度と言えます。本記事にはページ表示速度を改善するためいくつかの方法ををご紹介したいと思います。

DBの抽出を最適化

パフォーマンスを最適化する時、クエリの最適化が頭に浮かぶものです。なぜかというと、本当に動いているウェブには、データベース量がかなり大きくて、数百MBからGBまでにかかっているからです。つまり、クエリ文は数十万のレコードがあるテーブルで抽出を実施しています。DBの抽出を実現する時、以下の方法がいくつか適用しています。

①Database index (indexing)

まず、「Indexとは?」を説明したいと思います。 Indexとはデーター型の1つ種類であり、データ表にある一定のフィールドの値を含め、該当する行目(ロー)を指します。 では、Indexを貼ってからページ表示速度がどのように改善されますか?

例:SELECT * FROM users where name = ‘Lempi Veum’;

56.000レコードがある「users」テーブルで「name」にIndexを貼らない場合とIndexを貼っている場合で抽出して、比較しましょうか。Indexを貼っている場合の速度はあきらかに早いですね。そして、ページ表示の速度を考慮する時、DB内のフィールドをIndexを貼るすべきです(できれば、DBを構築する段階から)。また、Indexを貼る時、以下の段階に優先順位をつけて、対応してください。

  1. Pキー(PHP言語でLaravelは$table->increments()を使かたらPキーは自動的にIndexが貼られます。)
  2. 各テーブルの外キー
  3. 「where」文でよく使う (上述した例の通りです)

② Query cacheクエリキャッシュ
「The query cache stores the text of a SELECT statement together with the corresponding result that was sent to the client. If an identical statement is received later, the server retrieves the results from the query cache rather than parsing and executing the statement again. The query cache is shared among sessions, so a result set generated by one client can be sent in response to the same query issued by another client.」

上記の文章がMySqlのホームページで「query cache」を定義しているものです。複数のユーザーが同じいページにアクセスする時、抽出結果が既にcacheに保持されておきました。ですから、他のユーザーはそのページにアクセスすると、cacheからクエリした結果を出して、ページの表示速度が早くなってきます。詳細な方法はこちらでご参考ください。しかし、 MySql 5.7.20バージョンでquery cacheが使えなくなります。 MySql 8.0バージョンから完全に除外されることになります。

その他の方法はLaravel等のフレームワークを使ってください。 cache queryを保存する為に、既にサポートしているので、とても便利です。

123$posts = Cache::remember(‘index.posts’, 30, function() {return Post::with(‘comments’, ‘tags’, ‘author’, ‘seo’)->whereHidden(0)->get();});

課題の処理ロジックを変更する

DB内の抽出を最適化にしても、ページ表示速度があまり改善されない場合、どうすれば良いでしょうか。今の課題で対応した方法(ロジック)を変更する方向で検討してみてください。

例えば、あるシステムの集計機能を実装しています。日間や年間をかけて膨大なデーター量で抽出しないといけません。その時、リアルタイムにてデーター集計することが不要になる場合があります。実際には、ユーザーにとって、30秒前の時点までに集計データーを正しく表示させることが要らないです。これは、ロジックを変更するすべきです。毎日・毎年等の集計はCronjか何かの作業で定期に実行され、結果を保存する方法はよく使われています。これで、実行に時間がかかる作業は裏で実施されると思います。ユーザーが短時間で集計の結果を見ることができるということです。

つまり、時間がかかるのにリアルタイムで不要になる作業は裏(underground)で実施した方が良いと思います。

cronjobを導入する前にDBのCPUの消耗


cronjobを導入した後DBのCPUの消耗

フレームワークのサポートを活用

現在、ウェブサイトがほとんどにフレームワーク(Laravel, WordPress, CakePhp, …)で開発されているようです。フレームワークなら既に最適化されたのでこのメリットを活躍すれば工数が非常に削減できると思います。Laravelで利用する場合、以下のいくつかポイントをオススメです。

Config cache

Laravel の既存コマンドを使ってキャッシュをコンフィグする:

php artisan config:cache

php artisan route:cache

php artisan view:cache


lazy loadingと eager loadingを利用

LaravelはDBを対応する時、素晴らしいORMを提供しています。 EloquentのようにDBの各テーブルからabstracts modelを作られます。Eloquentはeager loadingを利用する時、連携されているobject modelを全て抽出し、最初のクエリにレスポンスする為です。これはアプリケーションのレスポンスを追加されます。 

Lazy loadingは次のようにクエリします。

1234$books = App\Book::all();foreach ($books as $book) {echo $book->author->name;}

同様に、 eager loadingは次のようにクエリします。

1234$books = App\Book::with(‘author’)->get();foreach ($books as $book) {echo $book->author->name;}

適切なCacheと Sessionを利用

Laravelではパフォマンスを最適化する時、RAMの中にCacheとsessionを保存するのが一番良い方法だと思います。その他に、「Redis」 や「MemcachedCache」を利用すると、sessionの抽出する速度も改善できます。

Asset bundling

Laravelでは、Laravel Mixを提供して、複数のcss/jsを同一のcss/jsにコンパイルするツールです。そして、css/jsファイルを読み込む時、時間短縮されることが可能です。

まとめ

いかがでしょうか。

勿論、それ以外にパフォマンスを最適化する方法が様々あると思います。実用に応じて、相応しい方法を簡単に探して、利用することが可能です。Laravelでウェブサイト開発のパフォマンスを最適化する方法を調べた際に、 「optimize」といったキーワードを検索しました。それが、パフォマンスを最適化することに対する効果があります。

パフォマンスの最適化は大切な作業でウェブサイト開発から稼働にかけてずっと対応し続ける必要があります。今回、本記事の内容がお役に立てれば大変嬉しいです。

以上となります。

最後までお読みいただき、誠にありがとうございます。

参考サイト

  1. https://www.cloudways.com/blog/laravel-performance-optimization/
  2. https://viblo.asia/p/laravel-12-tips-de-toi-uu-hoa-performance-1VgZvogYlAw
  3. https://dev.mysql.com/doc/refman/5.7/en/query-cache-configuration.html

関連記事