2016-04-12 28 views
-1

私は自分のエンティティを更新するために外部サーバーからデータ(7k行のCSV形式の文字列)を取得するアプリです。各行は在庫のアイテムです。なぜコントローラが遅いのですか?

今日は仕事はうまくいっていますが、データを取得し、2D配列でプッシュし、BDDを更新し、最終的にbddコンテンツを表示するページをロードするために、60秒以上(prod env) ページを表示しているときだけ、約20秒です(まだプロットしています)。

これは、レコードのみを表示しているときのプロファイラのタイムラインの結果です。Symfony's profiler timeline さらに、最新の10個のリクエストリストには表示されません "updateAction"の原因をプロファイルできません。

2日前私はCSVファイルの各行をチェックして必要な場合にのみ追加しましたが、在庫を戻すときに後で元に戻すためにアイテムをソフト削除していましたが、正常なパフォーマンス。 すべての機能が制御装置に組み込まれていたので、専用サービスで追加/削除した機能をリポジトリに移動して、最終的にコントロールに戻しました。まともな結果を得るために、私はデータベースを空にして、チェックせずにそれを補充しようとしました。まず、LOAD DATA LOCAL INFILEを使用していますが、テーブルパターンと互換性がない(または私が何かを理解していない)ので、CSVを入力する前にテーブルを空にしています。私が以前に与えたタイムスコアは、この最後の試み(これは最高のもの)であった。ここ しかしenought話 は私のcontrolerです:

public function majClanCavernes() 
{ 
    $user = $this->get('security.token_storage')->getToken()->getUser(); 
    $outils = $this->container->get('loki_gbl.outils'); 

    if ($user !== NULL) 
    { 
     $pwd = $user->getGob()->getPwd(); 
     $num = $user->getGob()->getNum(); 
     if($outils->checkPwd($num, $pwd) !== TRUE) return FALSE; 

     $em = $this->getDoctrine()->getManager(); 

     //This is a temporary solution 
////////////////////////////////////////////// 
     $connection = $em->getConnection(); 
     $platform = $connection->getDatabasePlatform(); 
     $connection->executeUpdate($platform->getTruncateTableSQL('MatosClan', true)); 
////////////////////////////////////////////// 

     $repository = $em->getRepository('LokiGblBundle:MatosClan'); 

     $urlMatosClan = "http://ie.gobland.fr/IE_ClanCavernes.php?id=".$num."&passwd=".$pwd; 
     //encode and format the string via a service 
     $infosBrutes = $outils->fileGetInfosBrutes($urlMatosClan); 
     //$csv is a 2D array containing the datas 
     $csv = $outils->getDatasFromCsv($infosBrutes); 

     foreach($csv as $item) 
     { 
      $newItem = new MatosClan;     
      $newItem->setNum($item[0]); 
      $newItem->setType($item[1]); 
      [...] 
      $em->persist($newItem); 
     } 
     $em->flush(); 
     return TRUE; 
    } 
    else{ 
     return NULL; 
    } 
} 

間違っているもの:ここ

public function majMatosClanAction() 
{ 
    $resMaj = $this->majClanCavernes(); 
    if ($resMaj === NULL) 
    { 
     $this->get('session')->getFlashBag()->add('alert-danger', 'Unidentified'); 
     return $this->redirect($this->generateUrl('loki_gbl')); 
    } else if ($resMaj === FALSE) 
    { 
     $this->get('session')->getFlashBag()->add('alert-warning','password update required'); 
     return $this->redirect($this->generateUrl('loki_gbl_ST')); 
    } else 
    { 
     $this->get('session')->getFlashBag()->add('alert-success','success'); 
     return $this->redirect($this->generateUrl('loki_gbl_voirMatosClan')); 
    } 
} 

は私のコントローラ通話機能ですか? 7kラインはそれほど大きくありません!

hardware号の問題がありますか?

+0

ので、一部は遅いのですか?あなたはそれをプロファイリングしましたか? –

+0

私はしましたが、viewActionだけがプロファイラに見つかりました。 "最後の10の結果"でも、updateActionを見つけることができません。私はメッセージを編集し、symfonyのプロファイラが私に与えているタイムラインを追加しました。 –

答えて

1

doctrineのバッチ処理のドキュメントhereを参照してください。

また、ロギングを無効にすることができます。コードの

$em->getConnection()->getConfiguration()->setSQLLogger(null); 
+0

ロギングを無効にしましたが、実際の効果は2秒しかありません。また、バッチ処理は、各行を追加したいときでも役に立ちません。そして私はそれがより速く表示するのを助けることができる方法を見ません。 –

+0

申し訳ありませんが、アンカーが間違っています。一括入力までスクロール – tmanolescu

+0

今回は10回(batchSize = 100、1000で2回、20回では変更なし)です。ますますハードウェアの問題だと思います。私は深刻なホスティングソリューション上で私のアプリケーションを移動しようとするつもりです。 Thxあなたが答えに持っていた時間のため –

関連する問題