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コマンドを忘れずに実行しましょう。