Laravelアプリを高速化する方法をお探しでしょうか。
Laravelは、堅牢なセキュリティとシンプルかつ洗練されたコーディングアーキテクチャで知られる、人気のオープンソースPHPフレームワークです。事業の要となる最先端のウェブアプリケーションを構築する上で、素晴らしい選択肢となります。
しかし、最適化を怠ると、Laravelのパフォーマンスは低下する可能性が。
だからこそ、Laravelのパフォーマンス最適化のコツを理解しておくことをおすすめします。今回の記事では大事なポイントをご紹介します。
Laravelのパフォーマンス最適化の重要性
Laravelアプリケーションを成功に導くためには、リリースを迎える前に、そのパフォーマンスに細心の注意を払う必要があります。最適化の知識は、Laravel開発者が持つべきいくつかの資質のうちの1つです。
コードの微調整やコマンドの使用から、Laravelのパフォーマンスを最適化することができます。これが、アプリの効率に大きな影響を与えます。
Laravelは遅いのか
Laravelは高速なフレームワークで、パフォーマンスを向上させるための機能や特徴(Memcache、データベースサポート、Redisなど)が豊富に備わっています。また、Laravelを使うことで、大小様々なプロジェクトの目標達成に向けて、比較的少ない労力で堅牢なコードを記述することができます。
データはサーバーのRAMにKey-Valueのペアとして保存されるため、好きなだけキャッシュして、アプリやサイトを高速かつ円滑に維持することができます。Google Trendsによると、Laravelは現在PHPのバックエンドツールとして最も人気があります。
以前にリリースされたLaravel 9では、パフォーマンスの向上が図られています。例えば、PHPの仕様を最小限に抑え、PHP 8.1で20.65%高速に動作するSymphony 6.0の使用が必須要件となっています。route:listコマンドの新たなデザインにより、コマンド表示がすっきりしました。また、Laravel 9には、より効率的なQuery Builderインターフェースや、その他多くの機能が盛り込まれています。
とはいえ、Laravelのパフォーマンスが遅くなることもあります。重い画像を大量にアップロードする、古いバージョンのPHPを使う、不要なデータを大量にコンパイルする、プロジェクトから不要なファイルを削除しないなど、この全てが遅延を招きます。
Laravelの洗練されたMVC PHPアーキテクチャと関連ライブラリは、セキュリティ、パフォーマンス、ユーザビリティを見事に融合させるものです。そのため、これを活用しながら、Laravel最適化のコツを実践するのがおすすめです。
ウェブサイトの速度の重要性
どんなブランドイメージも、第一印象が肝心です。ウェブサイトの閲覧となると、表示速度が、それを大きく左右します。ネットを利用する人の約50%が、読み込みに3秒以上かかるウェブサイトを離れてしまうと言われています。
ウェブサイトの速度(つまり、ウェブサイトのパフォーマンス)とは、特定のウェブサイトから完全に動作するウェブページを読み込み、それをブラウザに表示するまでにかかる時間のことを指します。したがって、ユーザーエクスペリエンス(UX)とコンバージョン率に直接的な影響を与えます。
また、ウェブサイトのパフォーマンスは、検索エンジンにおけるSEOランキングにも影響します。訪問者が求める情報を複数のサイトが公開している場合、読み込みの速いウェブページの方が上位に表示される傾向にあります。サイトが低速であれば、Googleの検索結果で上位に表示される可能性は低くなります。
したがってウェブサイトパフォーマンスの最適化に時間を投資することが欠かせません。
Laravelパフォーマンス最適化のメリット
素晴らしいLaravelアプリケーションを設計しようとも、完璧な動作を目指し、継続的に改善を行うことが重要です。Laravelのパフォーマンス向上には、多くの利点があります。
- 事業の成長を後押し:Laravelのパフォーマンス向上は、ウェブサイトやアプリケーションの効率化を意味します。その結果、より多くの人に訴求できる可能性が高まります。
- 開発環境の円滑化:以下に示すLaravelパフォーマンス最適化のヒントは、開発者によるコード記述の時間を短縮し、タスクの素早い実行、消費リソースの削減を助けます。
- トラフィックを効率的に処理:Laravelのキューシステムを巧みに利用する方法を学ぶことで、ウェブサイトが成長し、大量のトラフィックが流入するようになっても、リクエストをうまく管理することができます。
Laravelのパフォーマンスを測定する方法
多くの時間と労力を費やして、おしゃれなウェブアプリを作り上げても、それで終わりではありません。動作が遅いと誰も使ってくれないでしょう。そこで、Laravelのパフォーマンステストの出番です。
さまざまなツールを使って、アプリのパフォーマンステストを行うことができます。3つの選択肢をご紹介します。
1. Blackfire.io
Blackfire.ioは直感的に使えるウェブアプリのプロファイラーです。重要なパスを特定することで、PHPアプリの中でも対処の必要な部分に力を注ぐことができます。
複数のパフォーマンス監視機能を備え、メモリ使用量、CPU時間、I/Oが確認できます。また、Blackfire.ioでは、関数呼び出しやパスをソートして、Laravelアプリケーションがどのように動作しているのかチェックすることも可能です。
2. Laravel Dusk
Laravel Duskでは、アプリケーションをテストし、ユーザーの視点から挙動を確認することができます。DuskにはデフォルトでChromedriverが含まれているため、SeleniumやJDKをインストールする必要はありません。
Duskのような開発者向けのAPIを使えば、ブラウザテストを自動化でき、ChromeDriverやPHP WebDriverで別途必要な厳密なプロセスが不要になります。
さらに、Duskには失敗したテストのスクリーンショットやブラウザコンソールの出力が保存されるので、バグを洗い出すのに有用です。
3. LoadForge
LoadForgeは、Laravelを念頭にカスタマイズが施されたツールです。ウェブサイトを自動でスキャンして問題を特定するのに定評があり、各ページのパフォーマンスデータを、見やすいグラフなどとあわせて確認することができます。
Chromeでブラウザの挙動をキャプチャし、LoadForgeテストに変換することも可能です。これにより、ログイン、ウェブサイトのナビゲーション、注文などをシミュレートし、より実世界に近い状態でユーザーエクスペリエンスを測定できます。
Laravelのパフォーマンスを最適化する方法(17の手法)
続いては、Laravelのパフォーマンス向上に便利なコツや技術を詳しくご紹介します。
1. ルートキャッシュ
ルート(route)キャッシュは、特に多数の設定とルートがコードに分散しているアプリにとって有用な機能です。ルート群を1つのコマンドにまとめ、ルート管理の面倒な作業を軽減することができます。その結果、ウェブページの大幅な高速化が期待できます。
ルートキャッシュにより、ユーザーごとに一から始めるのではなく、事前にコンパイルしたキャッシュから定期的にルートを取得できます。
このコマンドを使用して、要となるルートデータをキャッシュするのが効果的です。
php artisan route:cache
キャッシュは、ユーザーがサイトを離れると失効しますのでその点にはご注意ください。また、ウェブサイトの構造的な変更(ルートファイルや設定など)を行った後は、変更を反映するために、その都度ルートキャッシュコマンドを実行する必要があります。
ルートキャッシュをクリアするには、以下のコマンドを実行します。
php artisan route:clear
2. Composerを最適化する
Laravelでは、さまざまな依存関係の管理に、Composerという別のツールが使用されています。Composerを最初にインストールすると、デフォルトでdevの依存関係がシステムに読み込まれる仕様です。
この依存関係は、ウェブサイトを開発する上では便利です。しかし、サイトが完全に動作するようになれば、必要なくなります。むしろ遅くなるだけです。
Composerでパッケージをインストールする際に、次のように--no-dev
と-o
パラメータを使用して、devの依存関係を削除できます。
composer install --prefer-dist --no-dev -o
このコマンドにより、オートローダーを最適化、パフォーマンス向上のためのディレクトリが作成されます。このコマンドは、公式ディストリビューションを取得し、パッケージ化するよう要求するだけで、開発依存性はありません。
ただし、ランタイムの依存性を排除しないようにご注意ください。ウェブサイトのパフォーマンス低下やクラッシュの原因となる可能性があります。
3. オートロードされるサービスを減らす
Laravelの目標は、開発者による作業を楽にすることです。例えば、Laravelを起動すると、config/app.phpファイルに記載されている大量のサービスプロバイダが自動で読み込まれ、素早く着手できる状態になります。
これはLaravelの便利な仕様ですが、アプリケーションを構築するために、このサービスすべてを使用する必要はありません。
例えば、REST APIを例にとってみましょう。ビューサービスプロバイダやセッションサービスプロバイダなどのサービスは必要ありません。さらに、フレームワークのデフォルトの設定に従うケースはそう多くありません。ケースバイケースで不必要なサービス(Pagination Service Provider、Translation Service Provider、Auth Service Providerなど)を無効にすることをおすすめします。
この原理を使うことで、Laravelアプリケーションの速度を向上させることができます。ただ、重要なサービスを削除しないようにご注意ください。闇雲に削除せずに、念を入れて確認するようにしてください。
4. artisanコマンドとキャッシュを効果的に使用する
artisanは、Laravelに付属する人気のコマンドラインツールです。複雑な作業を、繰り返し、自動化を用いて実行できるようになります。サイト作成時にテストやコマンドを生成するのに使用することも可能です。
artisanのコマンドを上手に使えば、アプリのパフォーマンスを向上させることができます。以下に、便利なキャッシュコマンドをいくつかご紹介します。
コンフィギュレーションキャッシュ
config:cacheは、速度を向上させる優れたコマンドです。アプリケーションのすべての設定値を1つのファイルにまとめることで、フレームワークの読み込みが速くなります。以下を実行するだけでOKです。
php artisan config:cache
ローカルでの開発中にはconfig:cacheコマンドを実行しないようにご注意ください。というのも、開発中には、この設定を頻繁に変更する必要が生じる可能性があります。
これをクリアするには、次のコマンドを実行します。
php artisan config:clear
ビューキャッシュ
ビューキャッシュを使ってキャッシュを操作することもできます。ビューキャッシュは、生成されたBladeテンプレートを保存して、プロジェクトの速度を向上させるものです。以下のartisanコマンドを使用し、すべてのビューをコンパイルし、パフォーマンスを最適化することができます。
php artisan view:cache
新しいコードをアップロードする最には、キャッシュのクリアをお忘れなく。これを怠ると、Laravelで古いビューが使用され、トラブルシューティングに多くの時間を費やすことになります。以下のコマンドを実行して、ビューキャッシュをクリアできます。
php artisan view:clear
アプリケーションキャッシュ
こちらが、Laravelのメインキャッシュという位置づけです。アプリ内で手動でキャッシュしたデータをすべて保存してくれます。よくアクセスされるデータを高速化し、Laravelのパフォーマンスを最適化するのに便利です。タグや複数のキャッシュストレージを使用する場合には、キャッシュの特定の要素のみをフラッシュすることも可能です。
以下は、Laravelのキャッシュをクリアするartisanコマンドです。
php artisan cache:clear
ちなみに、このコマンドでは、/bootstrap/cache/フォルダにあるルート、コンフィギュレーション、ビューのキャッシュは削除されないことに留意してください。
5. パッケージの使用量を削減する
オープンソースのフレームワークとして、多くのコミュニティが存在するため、Laravelでリリースされるパッケージや、既存のパッケージの新バージョンが増え続けるのは当然のことです。次々に登場するパッケージやその機能を自由に取り込んで、アプリケーションで使用することができます。
パッケージは、composer.json
ファイルにインクルードします。こうすることで、依存関係とあわせてインストールすることができます。
とはいえ、新しいパッケージをアプリケーションに追加する前に、考慮すべき要素があります。例えば、すべてが同じ目的のために設計されているわけではありません。また、パッケージの中には、(時に不必要な)幅広い機能が搭載されているものもあります。
多くの依存関係を持つパッケージを利用すると、アプリケーションのサイズが大きくなり、最終的にはパフォーマンスが低下します。そのため、パッケージを追加する前に、依存関係をよく確認することが不可欠です。
6. 最新バージョンのPHPにアップグレードする
他のコードやソフトウェアプログラムと同じように、PHPのバージョンも常に最新のものに更新しておくのが得策です。
PHPのバージョンを最新版にする第一の理由は、セキュリティです。2年間、すべてのPHPリリースでセキュリティパッチとバグの修正が実施されています。メンテナンスが終了した古いバージョンを使用し続けると、システムが危険にさらされる可能性があります。
また、意識していない人もいますが、PHPのバージョンは一般的に、古いほど低速とされています。最新のPHPでは、リクエストの高速実行、 enum、fiber、継承キャッシュなどの優れた性能向上が行われています。
ちなみにKinstaでは、すべての環境で最新のPHPメジャーバージョン(PHP 8.1)を使用しています。各種機能をフル活用しながら、アプリの最適化を進め、最大限のスピードアップも実現可能です。
7. キューを利用する
時間のかかるタスクをキューに入れることで、Laravelアプリケーションの速度向上を図ることができます。
時に、情報がすぐに必要でないこともあります。そのような場合、タスクを延期して、後で別のプロセスによってバックグラウンドで実行させることができます(例:メールの送信など)。これによって、アプリのオンラインリクエストにおけるパフォーマンスを大幅に向上させることができます。
Laravelは、IronMQ、Redis、Amazon SQS、Beanstalkdなど、さまざまなキュードライバをサポートしています。さらに、内蔵のキューワーカーを以下のコマンドで実行できます。
php artisan queue:work
このメソッドを使用し、ジョブをキューに追加することができます。
Queue::push('SendEmail', array('message' => $message));
キューに登録されているジョブの実行を遅延させるには、Carbonで以下を実行します。例えば、クライアントがアカウントを作成した10分後にメールを送信するジョブをスケジュール方法は以下の通りです。
$date = Carbon::now()->addMinutes(10);
Queue::later($date, 'SendEmail@send', array('message' => $message));
8. デプロイツールを使ってすべてのコマンドにアピールする
続いては、Laravelの純粋なパフォーマンス向上のヒントではありませんが、開発者にとって、生産性の向上と同じくらい重要な点である時間節約術を紹介します。
PHPベースのデプロイツールDeployerはを使えば、コードを複数のサーバーにデプロイすることができます。Laravel、Symfony、Zend、Magento、CakePHPなど、人気のフレームワークを意識したスクリプトが組み込まれています。
プロジェクトの依存関係を管理するのにComposerを使用したことがなくても、Deployerにはすぐに使いこなすことができます。このツールを使って、サーバーの起動、リモートサーバーへの複製、リモートホストの監視など、デプロイ操作を自動化可能です。
Deployerには、Laravelアプリケーションのマイグレーション、シード、最適化機能を1つのコマンドで実行できる機能があります。
php deployer.phar deploy production
9. 小規模なプロジェクトにLumenを使用する
小規模なアプリケーション(モバイルアプリやAngularアプリなど)を開発する時など、Laravelのようなフルスタックフレームワークを使用する必要がないことがあります。そんな場合には、代わりにLumenを使用するのも手です。
Lumenは、Laravelと同じ開発者により開発されたマイクロフレームワークです。Laravelの軽量版という位置づけで、マイクロサービス向けのスピードとパフォーマンスに特化しています。最小限の設定と代替ルーティングパラメータでアプリを構築でき、より高速な開発が可能になります。
例えば、Lumenは1秒間に100のリクエストを処理することができます。また、サードパーティのツールやパッケージを統合して、新しい機能を手に入れることも可能です。さらに、Lumenはすべてのプラットフォームをサポートしており、Laravelにアップグレードすることも可能です。
10. JIT/実行時コンパイラの活用
PHPはサーバーサイドの言語です。コードをコンピュータが理解できるバイトコードに変換するためにインタープリタが必要になります。
この処理には多くの時間がかかり、多くのリソースを消費します。そのため、Zend Engineのようなスクリプトエンジンを使ってC言語のサブルーチンを実行するのですが、アプリケーション実行のたびに繰り返さなければならず、アプリの動作が遅くなってしまうものです。
効率化のために、JIT/実行時コンパイラを使って、その手順を一度だけにすることができます。Laravelに適したJITコンパイラには、例えば、Facebookで発明され、広く使われているHHVMがあります。Etsy、Wikipedia、その他数多くのサイトでも同様に使用されています。
11. eagerロードの活用
Laravelには、データベースとの対話を多彩なものにするEloquentというオブジェクト関係マッピング(ORM)があります。これにより、テーブルを関連付け、PHPのすべてのCRUD機能をシンプルなフォーマットで処理することができます。
データベースからモデルを取得し、そのリレーションに対して何らかの処理を行う際、リレーションデータは遅延読み込みされます。つまり、リレーションにアクセスするまでデータが読み込まれることはありません。
次の例で示すように、遅延読み込みでは、レスポンスを見つけるためにN+1回のクエリを実行することになります。
$books = AppBook::all();
foreach ($books as $book) {
echo $book->author->name;
}
Laravelのパフォーマンスを最適化し、N+1クエリの問題を解決するために、Laravelでは以下のようにデータをeagerロードすることができます。
$books = AppBook::with('author')->get();
foreach ($books as $book) {
echo $book->author->name;
}
12. 画像の圧縮
画像は、ウェブサイトのデザインにおいて重要な役割を果たします。ユーザーエクスペリエンス(UX)を向上させ、ひいては検索順位を上げるために欠かせないものです。
ウェブサイトの平均的な読み込み時間は2秒です。重い画像は、サイトの読み込み速度を低下させます。これにより、多くの訪問者を失うことになる可能性があります。
そこで画像圧縮です。その品質を犠牲にすることなく、サイズを最小化し、サイトスピードを最適化することができます。LaravelではTinyPNG、reSmush.it、ImageMinなど、写真を圧縮するオプションが多数用意されています。
13. CDNを使用する
コンテンツデリバリネットワーク(CDN) を使用することで、Laravelのパフォーマンスを本当の意味で最適化することができます。静的コンテンツを、ファイルがホストされているマシンから直接ロードするのではなく、CDNサーバーから取得することで、より素早く配信することができます。
言い換えれば、クラウドサーバーのグローバルネットワークに、サイトの最新のバージョンをキャッシュします。訪問者が遠く離れた場所にいても、ウェブサイトやアプリケーションが高速化します。
KinstaのCDNはCloudflareを採用しています。すべてのお客様に、無料にてご提供中です。これにより、お客様のウェブサイトのキャッシュファイルが(セカンダリCDNドメインではなく)プライマリドメインから配信されます。SEOランキング向上を後押しします。
KinstaのCDNではさらに、JavaScript、CSSファイルから不要なコンポーネントも削除することができます。サイトのページ表示にかかる時間、帯域幅の消費量を削減することにつながります。
14. JSとCSSコードを最小化する
さらに、JavaScriptとCSSファイルを圧縮することによって、Laravelのパフォーマンスを向上させることができます。
一般的には、空白、コメントの削除、短縮名を使った変数名変更などで、アプリケーションが軽量になります。加えて、必要であれば、画像のサイズをサムネイルのような小さなものに変更することもできます。
その結果、UXの向上、HTTPコールの低減が期待できます。
15. アセットバンドルの採用
Laravel MixやLaravel Packerなど、JavaScriptやCSSなどのファイルを圧縮して1つに束ねるツールがあります。
Laravelには、デフォルトでユーザーフレンドリーなAPIであるLaravel Mixが組み込まれています。汎用性の高いJavaScript、CSSプリプロセッサを使用し、PHPアプリのWebpackを簡単に定義することができます。
アプリケーションファイルで特定のスタイルが必要だと仮定すると、このように記述することができます。
mix.styles([
'public/css/vendor/normalize.css',
'public/css/styles.css'
], 'public/css/all.css');
Laravel Mixにより、normalize.css
とstyle.css
ファイルからall.css
ファイルが生成されます。つまり、各スタイルシートを別々に取得するのではなく、1つのall.cssファイルにまとめることが可能になります。
Composer経由でコマンドラインツールLaravel Packerをインストールすることもできます。これを使うと、JSとCSSのコードを圧縮、バンドル可能です。ただし、Laravel Mixよりも使い方は難しくなります。
この手法は、Laravelのパフォーマンスを引き上げるのに効果的でも、多くのファイルをマージすると巨大化し、結局は逆効果になり得ます。そんな問題が発生したときには、Laravel Mixの以下のコマンドを実行して、ファイルを縮小してください。
npm run prod
16. インクルードライブラリを制限する
Laravelでは、好きなだけライブラリを追加することができます。素晴らしい機能ですが、大量のライブラリを追加すると、アプリケーションのパフォーマンスに大きな負担がかかります。また、ユーザーエクスペリエンスにも悪影響が出る可能性があります。
そのため、コード内で使用しているライブラリのデータを確認することをおすすめします。ライブラリは、config/app.php file
にあります。この中身をチェックし、不要なものが見つかった場合には削除してください。
また、composer.json
に不要な依存関係がないか確認するのも有効です。
17. New Relicを利用する
New Relicは、アプリケーションパフォーマンス管理(APM)ツールです。Laravelアプリに統合して、パフォーマンスを反映した統計データを分析・監視し、リアルタイムで性能を最適化することができます。
New Relicを使うことで、Apdexスコアや他と比較したデータを確認できます。また、基準に応じてアラートポリシーを作成することも可能です。
サードパーティのサービスを利用するのが面倒であれば、KinstaのAPMをおすすめします。追加料金なしで、WPサイトのボトルネックを特定することができます。
まとめ
Laravelは人気のPHPフレームワークです。知識レベルに関係なく、あらゆる用途に活用することができます。たくさんの解説記事が用意されているのも、嬉しい特徴です。
アプリのユーザーエクスペリエンスについて言えば、スピードが肝要です。これが、オンラインプレゼンスの確立に貢献します。質の高いUXを提供できるように、十分な時間とリソースを割くことが重要です。
Laravelの開発の際には、今回の記事の内容を取り入れてみることをおすすめします。パフォーマンスが大幅に向上し、スムーズな動作を後押しすることができるはずです。
Laravelアプリの高速化について、他にはどのような方法を実践していますか?以下のコメント欄からお聞かせください。
コメントを残す