Laravel4、アプリの実行速度を上げる
タグ: Laravel4
Laravel4には、作成したアプリの実行速度を上げる仕組みがあります。といっても、オートロード関係です。
ここらへんの仕組みも、バージョン4リリース後変更が起きていますので、今回まとめておきます。
最適化Artisanコマンド
php artisan optimize
このコマンドでいつでも実行されるのは、たぶんcomposer dump-autoload --optimize-autoloader
、短いオプションの-o
です。
オートローディングの最適化
ComposerのオートローディングはPSR-0とクラスマップによる方法が指定できます。この内、PSR-0によるオートロードのファイルに対してもクラスマップを作成することで、ファイルアクセスを減らし、オートローディングを高速化させます。
デバッグオプション
app/config/app.php
の中には、debugオプションがあります。通常開発中はtrue、運用時はfalseにセットします。
このデバックオプションがfalseの場合、Laravelが使用するコアファイルのうち、恒常的に使用するクラスファイル約100個を一つのPHPファイル、bootstrap/compiled
としてまとめます。
Laravelはこのファイルが存在している場合、先立って読み込みますので、いつも使用するファイルは一回だけローディングするだけで済み、ファイルアクセスが多少減ります。
debugオプションがtrueですと、このファイルは削除されます。なぜなら、エラーなどが発生した場合、このcompiled.phpファイルが発生場所として示されてしまうため、エラーの追求がしづらくなるためです。
debugオプションがtrueの場合でもcompiled.phpファイルを生成したい場合は、forceオプションを付け、実行してください。
php artisan optimize --force
明示的にcompiled.phpを削除したい場合は、手動で削除しても構いません。もしくは、コマンドでも実行できます。
php artisan clear-compiled
これらは、オートロード関連の高速化です。他の部分に時間がかかっている場合、当然ながら効果は薄いでしょう。
サービスプロバイダーの遅延ロード
オートロードの改善と共に、サービスプロバイダーのローディングも改善されます。
compiled.phpと同時に、app/strorages/metaディレクトリーの中に、services.jsonが生成されます。
これには、どのサービスが、どのサービスプロバイダーを使用するかがまとめられています。このファイルが存在しない場合、Laravelはapp.phpのproviders設定に登録されているサービスプロバイダーをリクエスト処理の初めのほうで、全部インスタンス化し、実行します。この方法は、オーバーヘッドがかかります。
services.jsonが存在する場合、Laravelはこの中に指定されている情報をもとに、必要なサービスプロバイダーだけをインスタンス化し、実行します。具体的にはIoCコンテナのrigisterメソッドでIoCコンテナに対し、サービスを登録しますが、その名前とコンテナを紐つけています。
これにより、サービスが初めて要求された時まで、サービスプロバイダーの実行を遅らせます。その結果、無駄なサービスプロバイダーが実行されなくなり、パフォーマンスが改善します。
当方のローカル環境では、compiled.phpを作成すると、約10ミリ秒早くなります。これは、ハードや環境、アプリにより異なるでしょう。
それでも、手間なしに多少早くなります。アプリをリリースするときには、debugオプションをfalseに設定するのはもちろん、その後、optimizeコマンドを忘れずに実行しましょう。