草庐IT

php - Symfony 2 阻塞并发

coder 2024-04-27 原文

我有一个 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/

有关php - Symfony 2 阻塞并发的更多相关文章

  1. ruby-on-rails - 获取并发布相同匹配项的请求 - 2

    在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g

  2. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  3. ruby - IO::EAGAINWaitReadable:资源暂时不可用 - 读取会阻塞 - 2

    当我尝试使用“套接字”库中的方法“read_nonblock”时出现以下错误IO::EAGAINWaitReadable:Resourcetemporarilyunavailable-readwouldblock但是当我通过终端上的IRB尝试时它工作正常如何让它读取缓冲区? 最佳答案 IgetthefollowingerrorwhenItrytousethemethod"read_nonblock"fromthe"socket"library当缓冲区中的数据未准备好时,这是预期的行为。由于异常IO::EAGAINWaitReadab

  4. Ruby 并发/异步处理(简单用例) - 2

    我一直在研究ruby​​的并行/异步处理能力,并阅读了许多文章和博客文章。我查看了EventMachine、Fibers、Revactor、Reia等。不幸的是,我无法为这个非常简单的用例找到简单、有效(且非IO阻塞)的解决方案:File.open('somelogfile.txt')do|file|whileline=file.gets#(R)ReadfromIOline=process_line(line)#(P)Processthelinewrite_to_db(line)#(W)WritetheoutputtosomeIO(DBorfile)endend你看到了吗,我的小脚本正

  5. ruby - 如何使用 ruby​​ fibers 避免阻塞 IO - 2

    我需要将目录中的一堆文件上传到S3。由于上传所需的90%以上的时间都花在了等待http请求完成上,所以我想以某种方式同时执行其中的几个。Fibers能帮我解决这个问题吗?它们被描述为解决此类问题的一种方法,但我想不出在http调用阻塞时我可以做任何工作的任何方法。有什么方法可以在没有线程的情况下解决这个问题? 最佳答案 我没有使用1.9中的纤程,但是1.8.6中的常规线程可以解决这个问题。尝试使用队列http://ruby-doc.org/stdlib/libdoc/thread/rdoc/classes/Queue.html查看文

  6. ruby-on-rails - 乘客并发连接错误 - 2

    我有生产服务器(Nginx+Passenger)。当我尝试从另一台计算机ab-n3-c3myhost.ru/时,我在我的nginxerror.log中收到此错误日志:[pid=21160thr=139775297914624file=ext/nginx/HelperAgent.cpp:584time=2011-08-3115:25:49.22]:UncaughtexceptioninPassengerServerclientthread:exception:Cannotreadresponsefrombackendprocess:Connectionresetbypeer(104)ba

  7. 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模 - 2

    “架设一个亿级高并发系统,是多数程序员、架构师的工作目标。许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。”开篇要实现软件设计、软件开发在一个统一的思想、统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束。虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍然是必要的,为了开发一个支持DDD的框架,首先需要理解DDD的基本概念和核心的组件。一.什么是领域驱动设计(DDD)首先要知道DDD是一种开发理念,核心是维护一个反应领域概

  8. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

  9. ruby - 并发::Promise.all?不起作用 - 2

    在执行所有promise后,我正在尝试进行一些计算。但是proc从不调用:cbr_promise=Concurrent::Promise.execute{CbrRatesService.call}bitfinex_promise=Concurrent::Promise.execute{BitfinexService.call}proc=Proc.newdoputs10endConcurrent::Promise.all?([cbr_promise,bitfinex_promise]).then{proc}使用concurrent-ruby制作gem。例如,我是否应该创建一个每100毫秒

  10. ruby - 通过 node-sass 的 Symfony assetic sass 过滤器? - 2

    我在让asseticsass过滤器与node-sass而不是ruby​​替代品一起工作时遇到了一些困难。我的config.yml文件中有以下配置:assetic:debug:"%kernel.debug%"use_controller:falsebundles:[]write-to:"%kernel.root_dir%/../web/assets"read_from:"%kernel.root_dir%/../web/assets"node:"%%PROGRAMFILES%%\nodejs\\node.exe"node_paths:["%%USERPROFILE%%\\AppData\

随机推荐