0

最近、Doctrine 2ORMをCodeIgniter2に統合しました。Doctrine2をライブラリとして構成し、CodeIgniterに自動ロードしました。ページ内で、次の方法でDoctrineエンティティマネージャーをインスタンス化します。

private static $em = null;

public function __construct() {
    parent::__construct();
    $this->em = $this->doctrine->em;
}

そして、必要に応じてエンティティマネージャを使い始めます。私が抱えている問題は、各ページリクエストでエンティティマネージャが初期化するのに時間がかかることです(約1秒)。これにより、ユーザーはページが読み込まれるまで待機します。以下に、私が測定したいくつかのパフォーマンス結果を示します。

BENCHMARKS  
Loading Time: Base Classes          0.0166
Doctrine                            0.0486
GetArticle                          1.0441
Functions                           0.0068
Controller Execution Time           1.1770
Total Execution Time                1.1938

GetArticle関数は、基本的にEntityManager-> find()呼び出しを行います。

$currentart = $this->em->find('Entities\Article', $artid);

EntityManager-> createQuery()メソッドを使用しても、その1秒待つ必要があります。

すべてのページで、EntityManagerの最初の要求により、約1秒の時間損失があります。

これは一般的ですか?

この1秒は、EntityManagerがDBへの接続を確立する必要があるという事実から来ていますか?ただし、最初のリクエスト後の関数/リクエストは非常に高速です。

4

1 に答える 1

1

Doctrineが行う最も時間のかかる作業は、アノテーション、XML、YAMLのいずれであっても、エンティティのメタデータをロードすることです。Doctrine lazyは可能な場合にメタデータをロードするため、エンティティの使用を開始するまでパフォーマンスへの影響は見られません。コードを変更しない限りメタデータは変更されないため、Doctrineではリクエスト間でメタデータをキャッシュできます。DQLクエリもSQLに解析する必要があるため、Doctrineはこのための別のキャッシュ構成を提供します。

実稼働環境では、これらのキャッシュを設定する必要があります(すでに設定しているように聞こえますが、他の人はこれを読んでいます)。

$cache = new \Doctrine\Common\Cache\ApcCache(); // or MemcacheCache $configuration->setMetadataCachImpl($cache); // caches metadata for entities $configuration->setQueryCachImpl($cache); // caches SQL from DQL queries

最初のページの読み込みでメタデータが完全に読み込まれないようにするために、すべてのクラスメタデータを読み込んでキャッシュに保存するキャッシュウォーマーを設定できます。

$em->getMetadataFactory()->getAllMetadata();

もう1つの潜在的なボトルネックは、プロキシクラスの生成です。これが実稼働環境で正しく構成されていない場合、Doctrineはクラスを生成し、ページが読み込まれるたびにそれらをファイルシステムに保存します。これらのプロキシクラスは、エンティティのコードが変更されない限り変更されないため、これが発生する必要はありません。処理を高速化するには、コマンドラインツール(orm:generate-proxies)を使用してプロキシを生成し、自動生成を無効にする必要があります。

$configuration->setAutoGenerateProxyClasses(false);

うまくいけば、これはあなたを助けるでしょう。詳細については、http://www.doctrine-project.org/docs/orm/2.0/en/reference/improving-performance.html#bytecode-cacheを参照してください。

于 2011-07-25T18:17:39.400 に答える