Есть ли альтернатива ajax, которая не требует опроса без изменений на стороне сервера? - PullRequest
11 голосов
/ 09 января 2009

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

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

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

Ответы [ 6 ]

11 голосов
/ 09 января 2009

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

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

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

Но для таких вещей Comet предназначена.

8 голосов
/ 09 января 2009

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

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

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

5 голосов
/ 09 января 2009

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

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

4 голосов
/ 11 января 2010

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

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

1 голос
/ 09 января 2009

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

1 голос
/ 09 января 2009

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

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

...