Как стать автором
Обновить

Создание сервера для онлайн ММО игр на PHP ч. 3 — WebSocket

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров4.7K

В 3й части статей я расскажу простым языком про протоколы передачи данных, как они работают и что такое Websocket сервер и какие есть решения для его создания на PHP

Что такое Websocket сервер

В предыдущей части я рассказал с какими проблемами предстоит столкнутся разработчику при проектировании игрового сервера и пути их решения. Мы определились , что для обработки входящих соединений потребуется некое CLI приложение (демон) - Websocket сервер, которое будет обслуживать входящие запросы от пользователей. Хорошей библиотекой для этого является workerman .

Сам протокол websocket это TCP протокол постоянного соединения (скажем так есть некие "базовые" протоколы на которых делаю уже свои "подпротоколы") между клиентом и сервером (в отличие от HTTP который заканчивается при получении ответа от сервера) , в который группа разработчиков (говорю условно, для понимания) создала некий набор правил по формированию заголовков, разделителя пакетов данных и тп.

PS Никто не ограничивает самому написать свой протокол на базе TCP используя библиотеку по ссылке выше

Его плюсы в том что TCP - так называемый протокол гарантированной доставки пакетов (его можно сравнить с системами очередей который при получении пакета должны отправить назад подтверждение о получении) , а наличие постоянного соединения не требует времени на установку каждый раз нового (как HTTP протокол - правда у него есть Connection: Keep-Alive для поддержания соединения, который правда все равно закроется спустя пару секунд бездействия, но для пошаговых игр подойдет и он) с отправкой дополнительных пакетов а так же пакеты доставляются в той последовательности в которой были отправлены пользователю плюс мы можем без действий со стороны пользователя слать ему новые данные с разной периодичностью.

Из минусов можно выделить : на проверку доставки данных (запрос - ответ) требуется дополнительное время, пакеты идут друг за другом, а не параллельно, так же помимо данных шлются некие системные заголовки (накладные расходы)

PS существует еще один "базовый" протокол - UDP , имеющий меньше накладных расходов , отправляющий данные параллельно целым потоком, не гарантировав их доставку - такой сервер так же может быть игровым например в тех играх где поток данных настолько большой что потеря части - сильно скажется на игровом процессе (например игра Counter-Strike)

Какова пропускная способность

Есть ряд статей , которые рассматривают теоретическую часть пропускной способности TCP на одном порту стремящуюся к миллиардам пользователей, но рассмотрим тесты на базе фреймворка (доступна установка через composer ) workerman :

По результатам тестов мы можем видеть что workerman стоит на следующих позициях:

  • 1 место (с использованием php 8 и Jit пре компиляции php скриптов в некие "бинарники")

  • 2 место - его модификация с заменой Apache и Nginx на HTTP сервер написанный на PHP слушающий порт сервера (те работает и определяется PHP как CLI , без запуска fpm workers). Документация на Китайском , но механика следующая : Singleton'ы (грубо говоря закешированные экземпляры классов) всех контроллеров, вызывающиеся в onMessage() (метод срабатывающий когда на порт сервера приходят данные посланные клиентом из браузера) с параметрами которые пришли в запросе и увеличенный параметр keep-alive (те между браузером и сервером устанавливается постоянное TCP соединение которое дольше остается открытым чем в том же Apache где этот параметр ~10 секунд) - нам не очень актуален этот фреймворк тк мы не будем использовать HTTP

  • 3 и 8 место держат вариации с использование PostgreSql и без модификаций

В среднем ~ 350 000 запросов в секунду . Хотя рейтинг и для HTTP протокола, но включенный keep-alive заставляет сервер работать на подобии websocket удерживая соединения).

Остается вопрос: хороший ли это показатель и какое число пользователей можно держать онлайн ?

Ответ на этот и другие вопросы я опишу в следующей части статей про разработку сервера для онлайн игр на php

Буду признателен за лайки - так я могу видеть интересна ли вам данная тематика и стоит ли ее продолжать (тк в русскоязычном пространстве достаточно мало информации про то как создавать сервера для игр, о чем я писал в первой части серии статей).

Подписывайтесь на мой профиль что бы не пропустить новые статьи

История:

  1. Введение

  2. Масштабируемость и асинхронность

  3. WebSocket

  4. Redis

  5. LUA и JavaScript

  6. Выбор технологий, протокола и архитектурный шаблон Entity Component System

  7. Игровые локации (тайловые карты)

  8. Клиентская часть на Unity

  9. Игровые серверные механики

  10. Открытый бесшовный мир в 2D игре

  11. FPS, Ping, паузы между командами, интерполяция и экстраполяция

  12. Очереди и параллельное программирование на CPU

  13. Event-driven паттерн, JSON-RPC и почему не сервисная (SOA) архитектура

  14. Сетевая карта и задержка кадра (Latency frame) по RFC 2544 (1242)

  15. Создание сервера для онлайн ММО игр на PHP

  16. Готовое MVP сервиса 2D MMO RPG игр (realtime)

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Нравится ли Вам как преподносится материал?
42.86% Да, все простыми словами и понятно9
47.62% Нет, нужно больше технического языка и подробностей10
9.52% Мне ничего не понятно из написанного2
Проголосовал 21 пользователь. Воздержались 11 пользователей.
Теги:
Хабы:
Всего голосов 4: ↑3 и ↓1+2
Комментарии2

Публикации

Истории

Работа

PHP программист
124 вакансии

Ближайшие события

Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область