2015-09-05 71 views
0

在我的symfony應用程序中,我正在生成一個表單以便參數某些成分。 我現在面臨用戶開始管理數千種配料的情況。symfony:表單代需要大量內存

只有200種成分,php的內存使用量超過了最高120Mo。

以下顯示使用50Mo和創建表單的操作統計數據需要40Mo。如果我嘗試渲染視圖,它會崩潰。

我該怎麼做才能避免表單花費太多內存?

我的控制器動作:

/** 
* @Route("/set_ingredient_stock", name="set_ingredient_stock") 
* @Method({"PUT","GET"}) 
* @Template(":FoodAnalytics/UserIngredient:set_ingredient_stock.html.twig") 
* @param Request $request 
* @Security("is_granted('organizer')") 
* @return array|\Symfony\Component\HttpFoundation\RedirectResponse 
*/ 
public function setIngredientStockAction(Request $request) 
{ 
    r('init : ' . ceil(memory_get_usage()/1000000)); 
    $userIngredientManager = $this->get('user_ingredient_manager'); 
    r('manager : ' . ceil(memory_get_usage()/1000000)); 
    /** @var User $user */ 
    $user = $this->getDoctrine()->getRepository('AppBundle:User\User')->findUserWithUserIngredients($this->getPortfolioUser()); 
    r('user : ' . ceil(memory_get_usage()/1000000)); 
    $setStockIngredientForm = $userIngredientManager->getSetIngredientStockForm($user); 
    r('form : ' . ceil(memory_get_usage()/1000000)); 

    if ($request->getMethod()=='PUT') 
    { 
     $formManager = $this->get('form_manager'); 

     if ($formManager->handleRequestAndFlush($setStockIngredientForm, $user)) 
     { 
      $this->addSuccess("Le stock d'ingrédients à été mis à jour"); 

      return $this->redirectToRoute('set_ingredient_stock'); 
     } 

     $this->addInvalidFormMessage(); 
    } 

    $nonExecutedTasks = $this->getDoctrine()->getRepository('AppBundle:FoodAnalytics\Task')->getNonExecutedTasksQueryBuilder($this->getPortfolioUser())->select('COUNT(t)')->getQuery()->getSingleScalarResult(); 
    $nonReceivedOrders = $this->getDoctrine()->getRepository('AppBundle:MarketPlace\Order')->getNonReceivedOrdersQueryBuilder($this->getPortfolioUser())->select('COUNT(o)')->getQuery()->getSingleScalarResult();; 
    $horizon = $user->getParameter(User::STOCK_HORIZON) ?: 7; 
    r('small_variables : ' . ceil(memory_get_usage()/1000000)); 
    $userIngredients = $this->getDoctrine()->getRepository('AppBundle:FoodAnalytics\UserIngredient')->getUserIngredientsWithJoinsIndexedByProductIds($this->getPortfolioUser()); 
    r('user_ingredients : ' . ceil(memory_get_usage()/1000000)); 
    $stocks = $userIngredientManager->getUserIngredientStocks($userIngredients, $horizon); 
    ~r('stocks : ' . ceil(memory_get_usage()/1000000)); 

    return array(
     'set_stock_ingredient_form' => $setStockIngredientForm->createView(), 
     'non_executed_tasks' => $nonExecutedTasks, 
     'non_received_orders' => $nonReceivedOrders, 
     'stocks' => $stocks, 
     'horizon' => $horizon 
    ); 
} 

轉儲:

init : 50 
manager : 51 
user : 61 
form : 100 
small_variables : 100 
user_ingredients : 101 
stocks : 105 

編輯: 生成形式方法剛剛創建連接到誰擁有userIngredients集合用戶經常symfony的形式由另一種類型生成。每個用戶的成分有3個字段。

+0

蹊蹺的整個應用程序,就開始你有50MB?整個要求我從未超過20MB。剛剛檢查了一個控制器,註釋類似於你的,初始狀態下我有5個,在清除緩存之後,它首次訪問時增加到9。 – malcolm

+0

arf,解決這個問題可能會加快我的應用程序的速度!任何想法 ? –

+0

xdebug或任何其他工具來分析您的應用程序。 – malcolm

回答

0

沒有一個用戶正在等待數以千計的規則(或項目,表格等)的列表。如果還有大約25條規則,那麼沒有人想再讀它們了。

你應該更好地提供pagination和過濾器

+0

你是對的,我仍然在努力一點,因爲我的表中有非常自定義的數據,這些數據是從查詢結果中生成的,但是在查詢之後(例如股票進化給出了生成樹計劃任務結構)所以訂購這些數據意味着先計算一下......如果你看到一個解決方案 –