gpt4 book ai didi

php - Symfony 2 阻塞并发

转载 作者:可可西里 更新时间:2023-11-01 00:20:40 26 4
gpt4 key购买 nike

我有一个 Symfony 2.5 应用程序,但我在请求并发方面遇到了一些奇怪的问题。

为了演示这个问题,我创建了两个路由,分别是 /time/sleep。 Controller 的主体非常简单:

timeAction():
time();

sleepAction()
sleep(30);

当我在我的浏览器中请求 /time 路由时 - 它立即响应当前时间戳。但是,当我第一次请求 /sleep 路由然后请求 /time 路由时 - 它只是卡在那里直到 sleep() 完成。只有在那之后 /time Controller 才会响应时间戳。换句话说 - 一个请求正在阻止所有其他请求。一开始我什至没有注意到这一点,但是当您收到包含长期执行计划的请求时 - 它变得很明显。

这可能是什么原因?

我仍将自己进行一些额外的测试,以更深入地了解情况。我将尝试使用更多详细信息更新问题。

最佳答案

更新

看起来 PdoSessionHandler 现在使用它自己的一些锁定机制来防止并发请求。旧的解决方案将不再开箱即用。

官方解决并发问题的方法是在请求处理周期内尽快关闭session。您可以通过调用 $session->close()session_write_close() 来完成此操作.

但是,如果您确定您的应用程序中不会出现 session 数据冲突,您可以安全地禁用 PDO session 处理程序配置中的锁定:

# services.yml

session.handler.pdo:
class: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
public: false
arguments:
- "pgsql:host=%database_host%;port=%database_port%;dbname=%database_name%"
- db_username: %database_user%
db_password: %database_password%
db_table: session
db_id_col: session_id
db_data_col: session_value
db_time_col: session_time
db_lifetime_col: session_lifetime
lock_mode: 0 # LOCK_NONE

您可以在本期阅读更多内容: https://github.com/symfony/symfony/pull/10908

旧解

感谢Crozin谁指出了我正确的方向,帮助解决了我的问题。我将在此处提供更多信息,希望将来能帮助某人节省一些时间。

以下主题中也描述了该问题:

问题是 PHP 默认使用基于文件的 session 处理。换句话说, session 数据存储在服务器文件系统的特定文件中。并且为了保护这个文件不被意外同时写入,使用了文件锁定机制。这是经典locking problem在计算机科学中。对 PHP 的第一个请求将获得对 session 文件的锁定,所有其他请求都必须等待该锁定被释放。如果您在多请求环境中有一个持久的请求(例如同时 AJAX 请求或页面上的多个框架),它就会变得很明显。

可以通过调用 session_write_close() 来解决问题。过早地,在脚本完成之前,但在所有 session 操作完成之后,或者通过切换到另一种 session 存储机制,如数据库 session 存储。

我认为,在 Symfony 2 中,最好的做法是使用 PDO 处理程序存储 session (在您选择的数据库中)。这是如何设置它的官方教程:

How to Use PdoSessionHandler to Store Sessions in the Database .

提示:如果您正在使用 Doctrine 迁移,那么您可以创建一个新的迁移类并向其添加创建 session 存储表所需的 SQL。

通过这种方法,您将拥有更好的非阻塞 session 存储机制,并且您的应用程序将能够水平扩展。

关于php - Symfony 2 阻塞并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25592937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com