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

StackOverflow https://stackoverflow.com/questions/427861

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top