2011-07-23 2 views
0

最近Doctrine 2 ORMをCodeIgniter 2に統合しました。私はDoctrine 2をライブラリとして設定し、CodeIgniterで自動ロードしました。ページ内で次のようにdoctrineエンティティマネージャをインスタンス化します。Doctrine 2 EntityManagerが最初のリクエストで時間を失う

private static $em = null; 

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

次に、必要に応じてEntity Managerを使用し始めます。私が持っている問題は、各ページのリクエストでEntity Managerが初期化に時間がかかっていることです(appr。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機能がbasicly EntityManager->見つける()呼び出します:

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

を私が使用している場合でも、1秒を待たなければなりませんEntityManager-> createQuery()メソッド。

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

これは一般的ですか?

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

答えて

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();

別の潜在的なボトルネックは、プロキシクラスを生成することです。これが実稼働環境で正しく構成されていない場合、Doctrineはクラスを生成し、すべてのページのロード時にクラスをファイルシステムに保存します。エンティティのコードが変更されない限り、これらのプロキシクラスは変更されないため、これが再度発生する必要はありません。物事をスピードアップするには、コマンドラインツール(ORM:生成-プロキシ)を使用してプロキシを生成する必要がありますし、自動生成を無効にします。

$configuration->setAutoGenerateProxyClasses(false);

うまくいけば、これはあなたがアウトに役立ちます。いくつかの詳細はhttp://www.doctrine-project.org/docs/orm/2.0/en/reference/improving-performance.html#bytecode-cache

+0

にあります。こんにちは、ありがとうございます。残念ながら、私はあなたが送ったリンクからすでに内容を読みました。そしてあなたが指摘したように私はすでにApcCacheも使用しています。 ApcCacheを使用していても、各リクエストにメタデータがロードされているように見えます。 もう1つの興味深い点は、ApcCacheとArrayCacheの間にパフォーマンスの違いは見られないということです。これまでに読んだ記事では、ApcCacheを使用するとアプリケーションのパフォーマンスが向上すると期待しています。 私のApcCacheが正しく設定されていない可能性がありますか?あるいは、私はlocalhostで自分のアプリケーションを開発しているのでしょうか? –

+0

どこに次のコードを記述しますか?$ em-> getMetadataFactory() - > getAllMetadata(); また、事前にorm:generate-proxyでProxyクラスを生成しています。だから問題は別の場所になければならない。 –

+0

ApcCacheを使用するには、APCをインストールし、PHPで正しく動作することが必要です。 phpinfo()が実際に動作していることを確認してください。 –

関連する問題