パフォーマンス


Symfony は非常に高速です。もちろん、本当に速度が必要な場合は、Symfony を高速化する方法がたくさんあります。この章では、Symfony プログラムを高速化するいくつかの方法を検討します。

バイト コード キャッシュ (OPcache など) を使用する

パフォーマンスを向上させるときに最初に行うべきことは、「バイト コード キャッシュ」を使用することです。これらのキャッシュにはコンパイルされた PHP ファイルが保存され、リクエストごとに再度コンパイルされることを回避します。

利用可能な バイト コード キャッシュ が多数あり、その一部はオープン ソースです。 PHP 5.5 以降、PHP には OPcache が組み込まれています。古いバージョンで最も広く使用されているバイト コード キャッシュは APC です。

バイトコードキャッシュの使用にはすべての長所と短所があり、Symfony は「このタイプの環境で非常に優れたパフォーマンスを発揮する」ように構築されています。

ソース ファイルの変更を監視する

ほとんどのバイト コード キャッシュは、ソース ファイルの変更を監視します。これにより、ファイルのソース コードが変更された場合でも、バイト コードが自動的にコンパイルされるようになります。これは非常に便利ですが、少し負荷がかかりすぎます。

したがって、一部のバイト コード キャッシュには、これらのチェックをオフにするオプションが用意されています。たとえば、APC のチェックインをオフにするには、apc.stat=0php.ini 構成ファイルに直接追加します。

これらのチェックがオフになっている場合、「ソース ファイルが変更されたときにキャッシュが確実にクリアされるようにする」のはサーバー管理者の責任です。そうしないと、更新内容がプログラムに表示されなくなります。

同様に、プログラムのデプロイ時にバイト コード キャッシュをクリアする必要があります (たとえば、APC を使用する場合は apc_clear_cache() PHP 関数を呼び出し、Opcache を使用する場合は opcache_reset( ))。

PHP では、コマンド ラインと Web プロセスは同じ OPcache を共有しません。これは、ターミナルで特定のコマンドを実行しても、Web サーバー上の OPcache をクリアできないことを意味します。サーバーを再起動するか、Web サーバー経由で apc_clear_cache() または opcache_reset() 関数を呼び出すことができます (たとえば、Web スクリプトの実行時にこれらの関数を含める場合)。

Symfony で使用されるすべてのファイルを最適化する

デフォルトでは、PHP の OPcache はバイト コード キャッシュに 2000 個のファイルを保存します。この数値は通常の Symfony アプリケーションにはまだ小さすぎるため、opcache.max_accelerated_files 設定オプションをより高い値に設定する必要があります:

; php.iniopcache.max_accelerated_files = 20000

PHP リアルパス キャッシュの設定

PHP は内部キャッシュを使用して、「クラス ファイル パス」を「実際のファイル システム パス」にマッピングした結果を保存します。これにより、特に Windows プラットフォーム上で、多くの PHP ファイルを開く Symfony のようなプログラムのパフォーマンスが向上します。

デフォルトでは、PHP は 16K realpath_cache_size を設定しますが、これは Symfony にとって小さすぎます。この値を少なくとも 4096K に更新します。さらに、キャッシュ パスはデフォルトで 120 秒間のみ保存されます。また、realpath_cache_ttl オプションを使用してこの値を更新することも検討してください:

; php.ini
realpath_cache_size=4096K
realpath_cache_ttl=600

Composer のクラス マッピング関数を使用します

デフォルトでは、Symfony Standard Edition は autoload.php ファイル内の Composer オートローダー (オートローダー) を使用します。このローダーは、登録されたディレクトリに配置された新しいクラスを自動的に検索するため、使いやすいです。

残念ながら、これにはコストがかかります。クラスローダーは、特定のファイルを見つけるために、設定された名前空間全体を走査し、最終的にファイルを見つけるまで file_exists() 呼び出しを行う必要があるためです。希望のファイル。

最も簡単な解決策は、最適化された「クラス マップ」(クラス マップ) を構築するように Composer に指示することです。これは、すべてのクラスの場所の大きな配列であり、vendor/composer/autoload_classmap に保存されます。 php で。

このクラス マップはコマンド ラインから生成でき、展開プロセスの一部となる場合があります。

#
$  composer dump-autoload --optimize --no-dev --classmap-authoritative
#
  • --optimize
  • プログラム内のすべての PSR-0 および PSR-4 互換クラスを削除します。
  • --no-dev
  • 開発環境 (テストなど) でのみ使用するクラスを除外します。
  • --classmap-authoritative
  • Composer がクラス マップに表示されないファイル システム内のクラスを検索できないようにします。

APC によるオートローダーのキャッシュ

もう 1 つの解決策は、クラスが最初に見つかった後でその場所をキャッシュすることです。 Symfony には、特にこれに使用されるクラス ApcClassLoader が付属しています。これを使用するには、フロント コントローラー ファイルを調整するだけです。フレームワークの標準バージョンを使用している場合は、次の変更を加えることができます。

// app.php// ... 
use Symfony\Component\ClassLoader\ApcClassLoader; 
$loader = require __DIR__.'/../app/autoload.php';include_once __DIR__.'/../app/bootstrap.php.cache'; 
// Use APC for autoloading to improve performance
// Change 'sf2' by the prefix you want in order
// to prevent key conflict with another application
// 使用APC自动加载以提升性能,改变'sf2'为你希望的前缀,
// 以防止同其他程序发生key冲突$loader = new ApcClassLoader('sf2', $loader);$loader->register(true); 
// ...

詳細については、キャッシュ クラス ローダーの記事を参照してください。

APC オートローダーを使用する場合、新しいクラスを追加すると、それらは自動的に検出され、すべてが通常どおりに動作します (つまり、キャッシュを「クリア」する必要はありません)。ただし、特定の名前空間またはプレフィックスの場所を変更する場合は、APC キャッシュをフラッシュする必要があります。それ以外の場合、オートローダーは引き続きその名前空間内の古い場所にあるすべてのクラスを検索します。

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

柔軟な最適化とコードの再利用を確保するために、Symfony プログラムはさまざまなクラスとサードパーティのコンポーネントを利用します。ただし、リクエストごとに分散した場所からこれらすべてのクラスをロードすると、一定レベルの過負荷が発生します。負担を軽減するために、Symfony は bootstrap file というファイルを生成するスクリプトを提供します。これは、複数のクラス定義を 1 つのファイルにロードすることを考慮しています。このファイル (さまざまなコアクラスのコピーを含む) をインクルードすることにより、Symfony はそれらのクラスを含むソースファイルをインクルードする必要がなくなります。これにより、ハードディスクのスループット (ディスク IO) が大幅に低下します。

Symfony Standard Edition を使用している場合は、このブートストラップ スタートアップ ファイルを使用する必要があります。確実に使用するには、フロント コントローラー (通常は app.php) を開いて、次のコード行が実際に存在することを確認します:

1
##

ブートストラップ ファイルを使用する場合、2 つの欠点があることに注意してください:

  • 元のリソースのいずれかが変更されると (たとえば、Symfony の src を更新するときなど)、このファイルは再生成されます。コードまたはベンダーのサードパーティ クラス ライブラリ);
  • デバッグ時、開発者はブートストラップ ファイルにブレークポイントを設定する必要があります。

Symfony 標準バージョンを使用している場合、ベンダー クラス ライブラリが更新された後、スタートアップ ファイルは composer install コマンドを通じて自動的に再構築されます (注釈: Composer を指します)。 json ポストスクリプト等は手動で実行することも可能です)

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

バイトコードキャッシュを使用する場合でも、ブートストラップファイルは「変更」を監視する必要があるファイルが少なくなるため、パフォーマンスが向上します。もちろん、バイト コード キャッシュでこの機能がオフになっている場合 (つまり、APC で apc.stat=0 を設定している場合)、ブートストラップ ファイルを使用する理由はありません。

1
#
include_once __DIR__.'/../var/bootstrap.php.cache';