Symfony不提供并发请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Symfony不提供并发请求相关的知识,希望对你有一定的参考价值。

我的问题是我在使用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中打开的相同会话,您不能有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将同时处理该请求。

以上是关于Symfony不提供并发请求的主要内容,如果未能解决你的问题,请参考以下文章

使用Symfony开发模式执行并发请求时Apache崩溃

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

Symfony 自定义身份验证提供程序在请求重叠时注销

多个请求是多线程吗

Symfony2 将哈希片段参数附加到分页 URL

如何从设置中获取数据并发送到此片段