パフォーマンス

Symfony2 は、細かいチューニングを行わなくても十分な速度で動作します。もちろん、さらにスピードを求めるなら、 Symfony をさらに速くする多くの方法があります。 この章では、Symfony アプリケーションをより速くする、一般的で強力な方法を紹介します。

バイトコードキャッシュ(例:APC)の利用

パフォーマンスを向上させるためにすべき、一つのベスト(で簡単)な方法は、 「バイトコードキャッシュ」を使用することです。バイトコードキャッシュのアイデアは、 毎回 PHP ソースコードをリコンパイルする必要を無くすことです。 Symfony2 では複数のバイトコードキャッシュシステムを利用でき、そのいくつかはオープンソースです。 最も幅広く使われているバイトコードキャッシュは、おそらく APC でしょう。

バイトコードキャッシュを使用することのデメリットはなく、また、Symfony2 はバイトコードキャッシュの環境で問題なく実行されるよう設計されています。

さらなる最適化

バイトコードキャッシュは通常、ソースファイルの変更を監視します。 これは、ソースファイルの変更時に、バイトコードが自動的にリコンパイルされることを確実にします。 この振る舞いは便利ですが、オーバーヘッドになることは明らかです。

このため、ファイルの変更チェックを無効にするオプションを提供しているバイトコードキャッシュシステムもあります。 もちろん、ファイルの変更チェックを無効にした場合は、ソースファイルの変更時にサーバー管理者がキャッシュをクリアする必要があります。 そうしないと、変更した内容は反映されません。

たとえば、APC でこれらのチェックを無効にするには、php.ini 設定ファイルに apc.stat=0 という記述を追加するだけです。

キャッシュ Autoloader (ApcUniversalClassLoader など)の利用

Symfony2 スタンダードエディションのデフォルト設定では、autoloader.php ファイル内で UniversalClassLoader が使用されます。 このオートローダーは、登録されたディレクトリに配置された新しいクラスを自動的に検知するため、簡単に利用できます。

しかし、このローダーは設定されたすべての名前空間をファイルが見つかるまで file_exists を繰り返し呼び出すため、コストがかかります。

一番簡単な解決方法は、各クラスを最初に見つけた後、そのロケーションをキャッシュしておくことです。 Symfony には UniversalClassLoader を継承したローダークラスである ApcUniversalClassLoader が同梱されています。 このクラスローダーを使うと、クラスのロケーションを APC でキャッシュします。

このクラスローダーを使うには、autoloader.php の先頭部分を次のように変更します。

// app/autoload.php
require __DIR__.'/../vendor/symfony/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
require __DIR__.'/../vendor/symfony/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php';

use Symfony\Component\ClassLoader\ApcUniversalClassLoader;

$loader = new ApcUniversalClassLoader('some caching unique prefix');
// ...

Note

APC オートローダーを使っている場合でも、それまでと同じように 新しく追加したクラスは自動的に検出されて、問題なく動くようになります。 (キャッシュを「クリア」する必要はありません) しかし、名前空間のロケーションやプレフィックスを変更した場合、 APC キャッシュをフラッシュする必要があります。そうしなければ、 オートローダーは古いロケーションを見続けます。

ブートストラップファイルの使用

最適化の柔軟性とコードの再利用を確保するために、Symfony2 アプリケーションは 様々なクラスとサードパーティーコンポーネントを利用します。 しかし、リクエストがあるたびに、別々のファイルから、それらのすべてのクラスを読み込むと、相当なオーバーヘッドが生じます。 このオーバーヘッドを減らすために、複数のクラス定義をまとめたブートストラップファイル と呼ばれるファイルを生成するためのスクリプトが、Symfony2 Standard Edition には同梱されています。 ブートストラップファイル(コアクラスの多くのコピーを含んでいる)をインクルードすることで、ソースファイルを個別にインクルードする必要がなくなります。 これにより、かなりのディスク IO を減らせます。

Symfony2 スタンダードエディションを使用しているなら、すでにこのブートストラップファイルを使用しています。 フロントコントローラ(通常は app.php)を開いて、次の行が存在しコメントアウトされていないことを確認してください。

require_once __DIR__.'/../app/bootstrap.php.cache';

ブートストラップファイルの使用時は 2 つのデメリットがあることを注意してください。

  • オリジナルのソースが変更された場合、ブートストラップファイルを再生成する必要があります。 (たとえば Symfony2 のソースやベンダーライブラリをアップデートする時など)
  • デバッグ時は、ブートストラップファイル内にブレークポイントを入れる必要があります。

Symfony2 スタンダードエディションを使用している場合、php bin/vendors install コマンドを実行すると、ベンダーライブラリが更新された後、ブートストラップファイルが自動的に再構築されます。

ブートストラップファイルとバイトコードキャッシュ

バイトコードキャッシュ使用時でも、ブートストラップファイルを使用することで、ファイル更新の監視を行う対象ファイルが少なくなるため、パフォーマンスをさらに向上させられます。 もちろん、もしバイトコードキャッシュでファイル変更の監視を無効にしている場合(たとえば APC での apc.stat=0)は、ブートストラップファイルを利用する利点はありません。