Symfony不提供并发请求

问题描述 投票:2回答:1

我的问题是我在使用Apache / 2.4.6(CentOS)PHP / 5.6.31 MySQL 5.7.19的远程机器上运行的Symfony应用程序无法处理并发请求。这意味着在同时要求两个不同的页面时。第一个必须在第二个可以渲染之前完成。

我在同一台服务器上使用普通的Php编写了另一个站点,它可以同时渲染尽可能多的页面(它使用不推荐的mysql连接而不是像Doctrine那样的pdo)。

那说我做了以下测试:我已经插入了睡眠(3);在我的DefaultController。我要求该页面同时请求另一个页面。请参阅以下两个分析器:

带睡眠的页面(称为1st):没有睡眠的Page with sleep (called 1st)页面(称为第2页)。 Page without sleep (called 2nd)

  • 第1页正常加载时间为782ms
  • 正常加载时间是108ms

正如您所看到的,Symfony的Http防火墙正在加载第二页的所有时间。我的猜测(可能是愚蠢的)是第一个动作保持数据库连接,并且只有在它完成之后它才会让它去其他请求使用它。特别是与Doctrine使用PDO连接有关的事情。

顺便说一句,我已经阅读过帮助和文章,如: - What is the Symfony firewall doing that takes so long? - Why is constructing PDO connection slow? - https://www.drupal.org/node/1064342

附:我试过在apache配置中同时使用app.php和app_dev.php没有改变。坚持app_dev.php所以我可以拥有探查器。使用Symfony的内置服务器的本地开发具有相同的结果

php mysql symfony concurrency doctrine-orm
1个回答
4
投票

对于在PHP中打开的相同会话,您不能有2个并发请求,因此当您使用防火墙时,Symfony会锁定用户会话,直到您释放它为止,不允许其他页面呈现。

关闭会话后,您将释放锁定:

$session->save();

这有一些影响,之后您无法更新会话属性。

会话管理:https://symfony.com/doc/current/components/http_foundation/sessions.html

会话界面:http://api.symfony.com/4.0/Symfony/Component/HttpFoundation/Session/SessionInterface.html#method_save

如果您有多个具有不同会话的并发用户,PHP将同时处理该请求。

© www.soinside.com 2019 - 2024. All rights reserved.