同时连接到apache / php

时间:2014-01-05 08:37:53

标签: php apache session simultaneous-calls

我正在开发一个需要无休止的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。   - 本地存储:只允许一个选项卡发出请求。这个解决方案并不是那么糟糕,但需要一些工作   - 本地存储:禁止多个标签(最简单的解决方案,但不是很性感)

1 个答案:

答案 0 :(得分:1)

我终于找到了解决方案。

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

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

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

允许来自其他域的请求。

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