2014-01-05 9 views
0

Я работаю над проектом, который требует бесконечных запросов ajax. Запрос останавливается сервером, когда есть данные для отправки.Одновременное подключение к apache/php

Чтобы упростить тест, я сделал образец для имитации проблемы:

<?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 соединениями на клиент/сеанс. Есть идеи?

Edit:

Похоже, что это ограничение браузера: https://stackoverflow.com/a/985704/3036602 Каждый знает, как обойти это ограничение?

Редактировать 2: После поиска в Интернете я вижу, что я не единственный с этой проблемой. Я не нашел легкого решения. Я нашел два: - подход Facebook: использование разных субдоменов за вкладку. Это решение требует наличия определенного веб-сервера и DNS. - Локальное хранилище: только одна вкладка позволяет делать запросы. Это решение не так уж плохо, но нужны некоторые работы - Локальное хранилище: запрещено несколько вкладок (самое простое решение, но не очень сексуально)

+0

«Я работаю над проектом, который требует бесконечных запросов ajax. Запрос останавливается сервером, когда есть данные для отправки ». Итак, вы хотите создать сценарий отказа в обслуживании? – JakeGould

+0

Взгляните на [этот вопрос] (http://stackoverflow.com/questions/11185618/whats-the-maximum-number-of-simultaneous-connections-a-browser-will-make). Это также не будет работать на некоторых серверах MS IIS, так как 'flush()' не будет работать на этих серверах. – Michel

+0

Лично «do ... while» должен быть единственным запросом, вызванным с помощью запроса Ajax от клиента, а не серверная петля без конца. Он должен быть зациклен со стороны клиента (браузер). – Tigger

ответ

1

Наконец-то я нашел решение.

Браузер не разрешает слишком много подключений к домену одновременно. Для firefox и chrome предел равен 6.

Одним из решений является использование субдомена. Для этого вам нужно добавить запись для * .mydomain.tld в DNS. На PHP скрипт нужно добавить

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

, чтобы запросы от других доменов.

И, наконец, в вашем приложении JS вам нужно создать случайный субдомен (Math.random) и использовать его во всех ваших вызовах Ajax.