在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
编辑:生成表单的方法只是创建了一个普通的symfony表单,该表单附加到拥有另一个类型生成的userIngredients集合的用户。每个usercomponents有3个字段
没有一个用户在等待包含数千条规则(或项、表单等)的列表。如果有超过25条规则,那么没有人想再读它们了。
最好提供分页和过滤器