Symfony2请求并发

时间:2017-06-12 06:37:39

标签: mongodb symfony session concurrency

我遇到与Symfony2请求相关的问题。当我做一个请求时,一个进程,从MongoDB加载数据,启动。如果我在浏览器中打开一个新选项卡,并且我对应用程序(也是不同的路由)做了任何请求,虽然我已关闭旧选项卡,空白页面上传,等待响应。

会话管理是原生的。我想新的请求会杀死已经运行的所有进程。不是会话并发的问题,因为我想要一个' last will win'做法。我认为问题是针对HttpKernel的请求处理,但是我无法解决它。你能救我吗?

这是控制器动作:

/**
     * @Security("is_granted('IS_AUTHENTICATED_FULLY')")
     */
    public function searchAction(Request $request, $page = null)
    {
        //controlla la lista di autorizzazioni: l'utente può eseguire l'action solo se autorizzato per quell'attributo
        if ($this->authlist != null) {
            $authorized = false;
            foreach ($this->authlist as $auth) {
                if ($this->security_auth_checker->isGranted($auth, new VoterHelper())) {
                    $authorized = true;
                    break;
                }
            }
            if (!$authorized) {
                throw new AccessDeniedException("Accesso negato! L'utente non può accedere a questa funzionalità !");
            }
        }

        //recupera i dati
        $session = $request->getSession();
        $form = $this->formFactory->create($this->formType);

        $sessionNamePage = $this->formType->getName().'_page';
        if (($page) && ($session->get($this->formType->getName()))) {
            $form_data = $session->get($this->formType->getName());
            $form->setData($form_data);
            $session->set($sessionNamePage, $page);
        } else {
            $session->remove($sessionNamePage);
        }

        $form->handleRequest($request);

        if ($form->isValid()) {
            $form_data = $form->getData();
        }

        //passa alla business logic i parametri della form, i dati di paginazione e offset ed eventualmente la queryString del metodo get
        if (isset($form_data)) {
            $queryString = $request->getQueryString();

//             $form_data['page'] = $page;
//             $form_data['offset'] = self::OFFSET;

            $data = array();
            $data['form_data'] = $form_data;
            $data['page'] = $page;
            $data['offset'] = self::OFFSET;
            $data['query_string'] = $queryString;

            $results = $this->businessLogic->execute($data);

            if (is_array($results) && isset($results['reportsCounts'])) {
                $form_data['report_count'] = $results['reportsCounts'];
                $reports = $results['reports'];
            } else {
                $reports = $results;
            }
        }

        if ($form->isValid()) {
            //          $form_data = $form->getData();
            $session->set($this->formType->getName(), $form_data);
            $sessionNamePage = $this->formType->getName().'_page';
            if (!$session->get($sessionNamePage)) {
                $session->set($sessionNamePage, 1);
            }
        }

        return $this->templating->renderResponse($this->templatePath, array(
                'report_count' => (isset($form_data['report_count'])) ? $form_data['report_count'] : null,
                'reports' => (isset($reports)) ? $reports : null,
                'page' => $page,
                'offset' => self::OFFSET,
                'form' => $form->createView(),
        ));

1 个答案:

答案 0 :(得分:0)

我通过调用

解决了这个问题
$request->getSession()->save();

任何长期的过程。

通过这种方式,我强迫Symfony解锁会话文件。