Symfony无法同时处理多个请求

3
我的问题是,我的Symfony应用程序在远程机器上运行,使用的是Apache/2.4.6 (CentOS) PHP/5.6.31 MySQL 5.7.19,无法处理并发请求。这意味着当同时请求两个不同页面时,第一个页面必须完成才能呈现第二个页面。
我有另一个站点在同一台服务器上,用普通的Php编写,可以同时呈现尽可能多的页面(它使用已弃用的mysql连接而不是像Doctrine一样使用pdo)
也就是说,我进行了以下测试: 我在我的DefaultController中插入了一个sleep(3);。我请求了那个页面,同时请求了另一个页面。请参见下面的两个分析器:
Page with sleep (called 1st): Page with sleep (called 1st) Page without sleep (called 2nd). Page without sleep (called 2nd)
  • 第1页正常加载时间为782ms
  • 第2页正常加载时间为108ms
正如您所看到的,Symfony的Http防火墙占用了第二个页面的所有时间。 我的猜测(可能很蠢)是,第一个操作保持数据库连接,并且直到它完成后才让其他请求使用它。特别是与Doctrine使用PDO连接有关的事情。
顺便说一下,我已经阅读过像以下这样的帮助和文章: - 什么是Symfony防火墙所做的需要那么长时间? - 为什么构造PDO连接很慢? - https://www.drupal.org/node/1064342 P.S. 我已经尝试使用apache配置中的app.php和app_dev.php,但没有改变。坚持使用app_dev.php以便能够使用分析器。使用Symfony内置服务器进行本地开发具有相同的结果。

似乎是 PHP 会话锁:http://konrness.com/php5/how-to-prevent-blocking-php-requests/ - odan
1个回答

6
在PHP中,您不能同时进行两个对同一开放会话的请求。当您使用防火墙时,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 请注意 2。如果您有多个并发用户使用不同的会话,PHP将同时提供这些请求的服务。

非常感谢。这确实解决了锁定问题。 但是,原始问题是我创建了一个Symfony控制台命令,通过cronjob运行,需要很多分钟才能完成。这个操作如何锁定我的系统?它没有使用任何会话(如果我没有弄错的话)。 - marioskamperis
我建议针对那个问题创建另一个问题,因为该范围与当前问题相差甚远,然后在那里添加命令。 - albert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接