2012-05-13 3 views
1

管理対象ホストのcentOSを実行していた古いサーバから、AWSのUbuntuを実行する新しいサーバに移動しました。Symfony 1.4のリストページを新しいサーバで約10秒かかります

投稿するアイテムのリストを読み込むページがレンダリングに10〜12秒かかることがある(時には最大74秒)ことがわかりました。これは古いサーバーでは気付かれませんでした。私はnewrelicを使って何がそんなに長くかかっているかを見て、sfPHPView-> render()が99%の時間を費やしていることを発見しました。 nerelicから、ページをレンダリングするために約500コールがDBにあります。

ページはアイデアのリストで、各アイデアは1行です。 Doctrine 1.2の$ idea-> getAccounts() - > getSlug()を使用します。 accountは、外部関係としてアイデアにリンクされた別のテーブルです。これは、アイデア行ごとに数回呼び出されます。現在、各行要素のコードを保持するためにパーシャルは使用されていません。

  1. ロー要素にpartialを使用するとパフォーマンスが向上しますか? (現在はコードのメインテナンスのメリットは無視してください)
  2. 外部関係を介して接続されたデータを参照するためのベストプラクティスは何ですか? $ idea-> getAccounts() - > getSlug()が呼び出されるたびに、DBに呼び出しが行われることに驚いています。
  3. ubuntuでは、sfPHPView-> render()がcentOSよりも遅く実行されることは明らかですか?

答えて

2

私はあなたに私の考え

  • 行要素の部分を使用するときは、部分的でキャッシュをアフィン変換することができますので、それは、キャッシュにそれを置くために、より簡単ですを与えるでしょう。

  • 明示的なはクエリを作成するときにリレーションを定義しないため、Doctrineはリレーションを持つすべての要素を水和しません。この時点で、水和したい関係を手動で定義することができます。その後、あなたの電話$idea->getAccounts()->getSlug()は毎回新しいクエリを実行しません。

$q = $this->createQuery(); 
$q->leftJoin('Idea.Account'); 
  • はポイント3

PSなしアイデア:ポイント2のために、それは管理者世代内のクエリの多くを持っていることは非常に一般的ですときリレーションからの情報を(リストビューで)表示したい。ソリューションは、データを取得する方法を定義することです:あなたにgenerator.ymlで

:IdeaTableで

list: 
    table_method: retrieveForBackendList 

public function retrieveForBackendList(Doctrine_Query $q) 
{ 
    $rootAlias = $q->getRootAlias(); 
    $q->leftJoin($rootAlias . '.Account'); 

    return $q; 
} 
+0

これは、明示的な結合について知るのに非常に便利な@j0kです。だから私はこれを行う:$ q = Doctrine_Query :: create() - > from( 'Ideas I') - > where(some criteria) - > leftjoin( 'I.Account') - > execute();アカウントデータが明示的に含まれますか? sfPHPView-> renderFile()の他のスピードアップについて知っていますか? –

+0

あなたが明示的に追加すると、leftJoin Doctrineは結果を各行のアカウントデータでハイドレーションします。私は 'renderFile'のために他のスピードアップを知らない。 – j0k

0

私は私がやった他に何追加することになりますがjOkの推奨に加えて、ページの読み込み速度を向上させます。

  1. はその後、PHPのinclude()オブジェクトの作成を低減しているにinclude_partial()を使用してから変更Doctrineのpaginator
  2. に渡されたDQLクエリオブジェクトを返すに切り替え:明示的に加えて

    は、私は次のようでした加入しますinclude_partial()

  3. Hydrateオブジェクトの代わりに配列としてのDBからのデータ
  4. より多くの処理を行うことによってforeachループを削除しました。 DBの数を減少させるDB
  5. 中古結果&クエリキャッシュは、1〜4の操作を行って、それが5を作り、6以上、興味深いことに

PHPテンプレート生成時間を短縮するためにビューキャッシングを使用し

  • を呼び出しでイン効果的で簡単に実装できます。私は、キャッシュを使ってジャンプする前に、あなたのコードを改善するために何かがあると思います。

  • 関連する問題