Symfony不提供并发请求

时间:2017-12-20 17:56:18

标签: php mysql symfony concurrency doctrine-orm

我的问题是在 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) 没有睡眠的页面(称为第二个)。 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

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

1 个答案:

答案 0 :(得分: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将同时处理该请求。