【问题标题】:jquery ajax multiple requestsjquery ajax 多个请求
【发布时间】:2012-01-10 06:21:25
【问题描述】:

我使用 jQuery ajax 在函数中进行了类似请求的长轮询,它将一直运行。还有另一个请求将数据发送到 PHP 后端文件,第二个请求不是长轮询,它只是将数据发送到那个 PHP 文件。

问题:我使用 Firebug 检查了当长轮询请求正在运行时,只要长轮询正在运行,我就无法发送另一个请求。即使长轮询正在运行,我如何发送另一个请求?

注意:我在两者中都使用了async: true

另一个问题:我如何确保即使保存长轮询请求代码的函数也会被多次调用,但长轮询请求只会发出一次?

【问题讨论】:

    标签: php ajax jquery long-polling


    【解决方案1】:

    您的 php 是否使用基于会话的身份验证?您的问题可能是会话锁定。这可能发生在 PHP 中,它在每个请求的顶部无条件地使用 session_start(),并且有时是 MVC 框架中的默认行为,即使会话从未被修改。其他可疑用例是如果两个脚本都依赖于以管理员用户身份登录。

    如果您怀疑可能是这种情况,请在您不再需要修改两个脚本的会话数据后尽早尝试策略性地放置 session_write_close()

    【讨论】:

    • 在同一个请求中,session_write_close后不能修改会话。您应该将它放在最后一次需要在单个请求中修改会话之后。每次触发长轮询脚本都是一个单独的请求,数据发送脚本也是一个单独的请求。当每个请求触发时,您就有机会读取和写入会话。
    【解决方案2】:

    您需要使用async : true(这是默认设置)。

    如果您说async : false,则表示它执行同步请求,即它等待第一个请求完成后再执行任何操作。您需要一个异步请求,以便浏览器在等待第一个请求的响应时可以继续做其他事情。

    (很少需要async : false,如果您不确定是否需要它,几乎可以肯定不需要。)

    【讨论】:

    • 对不起,我弄错了或有人编辑了问题,我在两个函数中都使用 async : true
    • 好的,这让我的回答有些过时了。如果您已经在使用async : true,那么它应该可以工作 - 我之前肯定运行过多个同时的 ajax 请求(并且响应以不同的顺序返回,即首先处理最快)。
    • 我如何确保即使是保存长轮询请求代码的函数也会被多次调用,但长轮询请求只会发出一次。
    【解决方案3】:

    使用 Ajax、Jquery 的多个请求。

    默认情况下,Jquery 已经发出异步请求;但是,除非您使用 async: false 选项,否则 Javascript 代码中不会发生“排队”问题;这显然会阻止浏览器,直到请求终止。此外,出现此问题的原因如下:

    1 - 使用 PHP 的内置服务器 - 使用 PHP 5.5 的这一特性,在同一台机器上,即同一台计算机上,对请求的响应一个接一个。不过,我建议您使用最新版本的 XAMP 服务器测试脚本;

    2 - 使用会话 - 对于每个会话,对请求的响应以队列形式呈现,而不是并行呈现,但是,建议使用 session_write_close; p>

    3 - Apache 中指令的 MaxClients 选项的意外配置 - 如果第一个和/或第二个选项没有出现;第三个肯定是问题。要解决此问题,只需访问 httpd-npm 文件并为多个请求配置 MaxClients (256) 选项。在当前版本的 Apche 中,如果我没记错的话,MaxClients 选项已被 MaxConnectionsPerChild 取代。

    因此,所提供的选项也取决于所提供的上下文。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      相关资源
      最近更新 更多