首页 > 解决方案 > Symfony 中的会话锁定阻止加载其他页面

问题描述

我目前正在使用 Symfony 5 构建一个非常基本的应用程序。但是我有一个问题。

当我运行持续一定时间的任务时,在任务完成之前我无法加载辅助页面。

更详细地说,我的页面上有一个名为“start process”的按钮,它调用将执行 symfony 命令(它本身执行 python 脚本)的控制器。

Le code JS rien de plus basique jusque ici

        const startProcessBtn = document.querySelector('#startProcessBtn');

        startProcessBtn.addEventListener('click', () =>
        {
            fetch('http://localhost:8000/startProcess').then(response =>
            {
                console.log(response);
            });
        });

这是我的控制器功能

    /**
     * @Route("/startProcess", name="startProcess")
     * @param HubInterface $hub
     *
     * @throws \JsonException
     */
    public function startProcess(KernelInterface $kernel, Request $request)
    {
            $request->getSession()->start();
            $request->getSession()->save();
            $application = new Application($kernel);
            $application->setAutoExit(false);

            $queue    = $this->getDoctrine()->getRepository(Entity::class)->getNotProccesed();
            $progress = 0;
            $total    = count($queue);

            foreach ($queue as $queueItem)
            {
                $progress++;
                $update = new Update('http://localhost:8000/process', json_encode(['status' => 'info', 'title' => 'Start process'], JSON_THROW_ON_ERROR));
                $this->hub->publish($update);
                $input = new ArrayInput([
                                            'command'         => 'command:start',
                                        ]);
                $application->run($input);
                $update = new Update('http://localhost:8000/process', json_encode(['status' => 'success', 'title' => 'Finish process'], JSON_THROW_ON_ERROR));
                $this->hub->publish($update);
                $this->getDoctrine()->getRepository(Entity::class)->setIsProccessedById($queueItem->getId());
            }


        return new Response('ok');
    }

我已经遇到了阻止脚本执行的问题,因为脚本已经在执行中。这是由于必须关闭会话才能允许另一个脚本读取它。当时我使用了 session_write_close() 并且我的问题得到了解决,但是我在 Symfony 上,但即使使用会话并关闭它也不起作用。

问题仍然存在。

我的任务目前持续约 2 分钟,这意味着在此期间我无法同时在应用程序上执行任何操作,这些任务可能会增加到 10 分钟或更长时间。

如果有人可以帮助我,非常感谢!有一个美好的一天/晚上:-D

标签: phpsymfonysessionlockingsession-cookies

解决方案


推荐阅读