Symfony:表单生成需要大量内存


symfony : form generation takes a lot of memory

在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条规则,那么没有人想再读它们了。

最好提供分页和过滤器