Я работаю над проектом, который требует бесконечных запросов 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. - Локальное хранилище: только одна вкладка позволяет делать запросы. Это решение не так уж плохо, но нужны некоторые работы - Локальное хранилище: запрещено несколько вкладок (самое простое решение, но не очень сексуально)
«Я работаю над проектом, который требует бесконечных запросов ajax. Запрос останавливается сервером, когда есть данные для отправки ». Итак, вы хотите создать сценарий отказа в обслуживании? – JakeGould
Взгляните на [этот вопрос] (http://stackoverflow.com/questions/11185618/whats-the-maximum-number-of-simultaneous-connections-a-browser-will-make). Это также не будет работать на некоторых серверах MS IIS, так как 'flush()' не будет работать на этих серверах. – Michel
Лично «do ... while» должен быть единственным запросом, вызванным с помощью запроса Ajax от клиента, а не серверная петля без конца. Он должен быть зациклен со стороны клиента (браузер). – Tigger