【问题标题】:Simultaneous connection to apache/php同时连接到 apache/php
【发布时间】:2014-01-05 08:37:52
【问题描述】:

我正在开发一个需要无休止的 ajax 请求的项目。当有数据要发送时,请求被服务器停止。

为了简化测试,我做了一个样例来模拟问题:

<?php
// Close (and disable) session to avoid lock
session_start();
session_write_close();

echo '<pre>';

do {
    echo time() . "\n"; ob_flush(); flush();
    error_log($_GET['id'] . ' - ' . time());
    usleep(2000000); // sleep 2s to unload the CPU

} while (1);

在 Chrome 上,加载此页面将每两秒显示一次新的时间戳。在 Firefox 上,什么都不会显示,这就是为什么我放了一个 error_log

如果我打开脚本 6 次,一切正常。但是,如果我再打开一次,新标签页什么也不显示,并等待一个进程停止。使用私有模式或其他浏览器,我可以调用脚本 6* 次。

似乎 Apache 或 PHP 限制为每个客户端/会话 6 个连接。有什么想法吗?

编辑:

看来,这是浏览器的限制:https://stackoverflow.com/a/985704/3036602 有谁知道如何避免这个限制?

编辑 2: 在网上搜索后,我发现我不是唯一一个遇到这个问题的人。我没有找到任何简单的解决方案。我找到了两个: - Facebook 方法:每个标签使用不同的子域。此解决方案要求拥有特定的 Web 服务器和 DNS。 - 本地存储:只允许一个选项卡发出请求。这个解决方案还不错,但需要一些工作 - 本地存储:禁止多个标签(最简单的解决方案,但不是很性感)

【问题讨论】:

  • “我正在做一个需要无休止的 ajax 请求的项目。当有数据要发送时,请求会被服务器停止。”所以你想创建一个拒绝服务脚本?
  • 看看this question。这也不适用于某些 MS IIS 服务器,因为 flush() 不适用于这些服务器
  • 就个人而言,do ... while 应该是通过来自客户端的 Ajax 请求调用的单个请求,而不是没有结束的服务器端循环。它应该从客户端(浏览器)循环过来。
  • JakeGould > 不,长调用请求跳跳虎 > 在我的应用程序中,“睡眠”为 10 毫秒。我认为每秒向服务器发送 10 或 100 个请求并不是一个好主意。
  • 这似乎是一个糟糕的设计问题,请尝试根据使用情况发送 ajax 请求,如果您需要流式传输数据,请寻找其他解决方案

标签: php apache session simultaneous-calls


【解决方案1】:

我终于找到了解决办法。

浏览器不允许同时连接到域的太多。对于 firefox 和 chrome,限制为 6。

其中一个解决方案是使用子域。为此,您需要在 DNS 上为 *.mydomain.tld 添加一个条目。 在你需要添加的 PHP 脚本上

header('Access-Control-Allow-Origin: *');

允许来自其他域的请求。

最后,在您的 JS 应用程序中,您需要创建一个随机子域 (Math.random) 并在所有 Ajax 调用中使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2023-03-06
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多