Есть ли альтернатива ajax, которая не требует опроса без изменений на стороне сервера?

Я пытаюсь создать небольшую и основную многопользовательскую игру на основе ajax. Координаты объектов передаются PHP-обработчиком. Этот файл handler.php обрабатывается каждые 200MS, используя ajax.

Так как нет необходимости опроса, когда ничего не происходит, интересно, есть ли что-то, что могло бы сделать то же самое без частых опросов? Например. Комета, хотя я слышал, что вам нужно настроить серверные приложения для Comet. Это общий веб-сервер, поэтому я не могу этого сделать.

Возможно, файл handler.php может даже возвращать ответ, если ничего не нужно менять на клиенте, возможно ли это? Опять же, у вас все равно будет клиент, который будет бесполезно просить ответа, хотя что-то еще не изменилось. В принципе, он должен использовать только пропускную способность и выделять ресурсы, если что-то нужно сообщить клиенту, например. изменение координат объекта.

Ответ 1

Здесь решение - используйте поставщика кометы SaaS, например WebSync On-Demand. Нет ресурсов сервера, о которых нужно беспокоиться, обмениваться хостингом или нет, поскольку он все выгружен, и вы можете выталкивать информацию по мере необходимости.

Так как это SaaS, он будет работать на любом языке сервера. Для PHP уже существует издатель, готовый к публикации.

Ответ 2

Комета обычно используется для такого рода вещей, и она может быть хрупкой установкой, поскольку она не является особенно распространенной технологией, поэтому может быть легко не "правильно ее понять". Тем не менее, сейчас доступно больше ресурсов, чем когда я последний раз пробовал ~ 2 года назад.

Я не думаю, что вы можете делать то, о чем вы думаете, и иметь handler.php просто не вернуть ничего и прекратить выполнение: веб-сервер будет поддерживать соединение открытым и предотвращать дальнейший опрос до тех пор, пока handler.php не сделает что-то (завершает или обеспечивает выход). Когда это произойдет, вы по-прежнему обрабатываете ответ.

Вы можете попробовать длинный опрос, где ваш AJAX позволяет очень большой тайм-аут (например, 30 секунд), а handler.php вращается, не отвечая, пока ему нечего что-то сообщить, а затем вернется. (Вы хотите, чтобы вращение не было ресурсоемким). Если handler.php "истекает" и ничего не происходит, выйдите из него и повторите опрос AJAX. Так как это происходит только каждые 30 секунд, это будет огромным улучшением более чем 5 раз в секунду. Это свести ваш опрос к минимуму.

Но это то, для чего предназначена комета.

Ответ 3

Поскольку Ajax предлагает только модель запроса клиентского сервера (обычно называемая pull, а не push), единственный способ получить данные с сервера - через запросы. Однако общий способ обойти это заключается в том, что сервер может реагировать только тогда, когда он имеет новые данные. Таким образом, клиент делает запрос, сервер зависает от этого запроса, пока что-то не произойдет, а затем ответит. Это связано с необходимостью частого опроса, даже когда данные не изменились, так как вам нужен только клиент, который отправляет новый запрос после получения ответа.

Поскольку вы используете PHP, один простой метод может заключаться в том, чтобы PHP-код вызывал команду sleep в течение 200 мс одновременно между проверкой изменений данных и затем возвращал данные клиенту, когда он менялся.

РЕДАКТИРОВАТЬ: Я бы также рекомендовал иметь тайм-аут в запросе. Так что, если ничего не происходит в течение 2 секунд, сообщение "без изменений" отправляется обратно. Таким образом, клиент знает, что сервер все еще жив и обрабатывает свой запрос.

Ответ 4

Поскольку это помечено как "html5": HTML5 имеет <eventsource> и WebSocket, но сторона реализации все еще находится в будущем на практике.

Opera реализовала старую версию <eventsource> под названием <event-source>.

Ответ 5

В этом должен участвовать сервер. Узнайте у хостинг-провайдера, какие модули доступны. Или попытайтесь убедить их поддержать Комету.

Возможно, вам стоит рассмотреть небольшой виртуальный частный сервер (VPS) для этого.

Ответ 6

Одна вещь, которую нужно добавить в предложениях длительного опроса: если вы используете общий сервер, это решение будет иметь ограниченную масштабируемость, так как каждый активный длинный опрос будет поддерживать соединение (и серверный процесс для обслуживания этого соединения) активный. У вашего провайдера, скорее всего, есть ограничения (определяемые политикой или де-факто) на количество подключений, которые вы можете открыть одновременно, поэтому вы попадете в стену, если у вас будет больше сеансов/окон, чем при одновременном воспроизведении.