2015-09-05 43 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

你是对的,我仍然在努力一点,因为我的表中有非常自定义的数据,这些数据是从查询结果中生成的,但是在查询之后(例如股票进化给出了生成树计划任务结构)所以订购这些数据意味着先计算一下......如果你看到一个解决方案 –