Задержки в основном на отправке данных будет.
Если для получения данных от сервера ещё можно использовать стриминг (не уверен, что все браузеры поддерживают. Накрайняк jsonp стриминг), то для отправки событий на сервер (нажатия клавиш) придётся слать отдельный AJAX запрос на каждое событие. А это 400-600 байт оверхеда на заголовки.
Как показывает практика, в таких играх нужно запускать на поле бота, если игроков мало. Т.к. человек заходит в игру, видит что там никого нет и через минуту уже уходит и не возвращается.
У меня есть сайт, который не работает без WebSocket. Какие проблемы: Android в пролёте; Около 2% посетителей, зашедших на сайт видят заглушку (т.к. нет window.WebSocket); у ~8% от тех, кто не увидел заглушку (window.WebSocket есть) не получилось подключиться со 2-й попытки (прокси?).
Так что фоллбек всё ещё имеет смысл, если 10% аудитории вам дороги (хотя для реалтайм игры AJAX фолбек скорее всего будет добавлять заметных задержек даже при использовании keep-alive).
Ну и обязательно нужно реализовать периодический пинг-понг (есть такой тип фрейма в протоколе), чтобы закрывать сокеты отвалившихся клиентов.
Вебвизору/аналитике проще, потому что на сайте УЖЕ установлен JS с домена яндекса. Так что им достаточно в URL передать зашифрованную команду «запусти виджеты аналитики/вебвизора» и всё — проксирование в общем-то и не нужно становится.
Какой-то бессмысленный проект. Заменили один транспортный уровень на другой, да ещё и с потерей части функциональности (Middleware, gzip) и не получили никаких преимуществ (пушить события с сервера не позволяет). Хоть одна объективная причина для этого была?
Забавно, что весь проект по сути один файлик на 100 строк.
У нас ограничений нет. Интернет по кабелю либо по WiFi с персональными логинами/паролями. Есть гостевой WiFi в подсети — пароли развешаны свободно по офису.
Ну а для тех, у кого заблокировано, но очень хочется, всегда есть простые решения
Ппц, возможно я отстал от жизни, но для меня пост читался как «Мы решили сделать стартап, для этого мы взяли НЕНУЖНО, совместили его с НЕНУЖНО и задеплоили на НЕНУЖНО. В процессе выяснили, что НЕНУЖНО нам не совсем подходит и переехали на альтернативное НЕНУЖНО.»
Может я зря для разворачивания сервера вбиваю в консоль sudo aptitude install postgresql-server erlang nginx git logrotate postfix и после 20-30 минут редактирую конфиги.
Мне почему то кажется, что время, потраченное на изучение API и библиотек всех этих сервисов сравнимо со временем, которое нужно потратить на то, чтобы плюс-минус эквивалентное окружение научиться настраивать самому (или нагуглить подходящие HOWTO).
Особенно комично смотрится изначальное утверждение «поддерживать собственную инфраструктуру слишком дорогое удовольствие» и последующие переезды с сервиса на сервис.
Хоть скажите, не пожалели что с PaaS-ами связывались?
Можно урлы кодировать в поддомен, т.е. http://example.com/page.html подменять на http://example.com.proxy.indexisto.com/page.html — тогда достаточно подменять только абсолютные FQDN ссылки (<a href="http://..."), а относительные (<a href="/page.html") будут автоматически наследовать родительский домен и протокол.
Ну и многие сайты практикуют детектирование и выпрыгивание из айфреймов, нужно иметь в виду.
Я с PHP года 4 уже не работал, так что могу не знать нюансов, сужу по косвенным признакам… Вы написали, что переделали работу с сокетами на неблокирующую, но я нигде в коде не вижу вызовов stream_set_blocking да и read/write/fgets у вас используются так, как использовались бы с блокирующими сокетами. Мне кажется они у вас блокирующие…
Пример — вызов fgets (его вы уже выпилили) возвращает в 3-х случаях: сокет закрыт, достигнут лимит или найден "\n". Как она работает с неблокирующими сокетами вообще не представляю, но совершенно точно что нужно удостовериться, что последний символ в считанных данных это "\n".
Дальше fwrite: на неблокирующих сокетах он не обязан записывать всё, что ему сказали записать — сколько он запишет зависит от размера буферов, так что нужно делать что-то вроде
и дописывать остаток когда сокет снова станет записываемым.
Насчёт read та же фигня — в неблокирующем режиме он может вернуть хоть один байт (привет if(!$data)) хоть всё вплоть до $length. Так что всегда нужно проверять достаточно ли данных считалось и если нет — сохранять в буфер и дожидаться, пока сокет снова станет readable.
Тот факт, что сокеты у вас всё-же блокирующие, позволяет, по идее, заблокировать воркера послав, например, всего один байт, в то время как сервер делает read($fd, 10000). Хотя насчёт этого не совсем уверен, возможно в PHP там промежуточные буферы какие то есть.
В стандартной библиотеке есть полная реализация SSH сервера, клиента и SFTP.
Экономия строчек на SSH-ключи, но больше места занимает вычитывание ответов.
Если для получения данных от сервера ещё можно использовать стриминг (не уверен, что все браузеры поддерживают. Накрайняк jsonp стриминг), то для отправки событий на сервер (нажатия клавиш) придётся слать отдельный AJAX запрос на каждое событие. А это 400-600 байт оверхеда на заголовки.
my_array.map(...)
илиmy_array.forEach(...)
Так что фоллбек всё ещё имеет смысл, если 10% аудитории вам дороги (хотя для реалтайм игры AJAX фолбек скорее всего будет добавлять заметных задержек даже при использовании keep-alive).
Ну и обязательно нужно реализовать периодический пинг-понг (есть такой тип фрейма в протоколе), чтобы закрывать сокеты отвалившихся клиентов.
Features тут jedi.jedidjah.ch/en/latest/docs/features.html
Забавно, что весь проект по сути один файлик на 100 строк.
С keep-alive у urllib к сожалению всё печально. Рецепты есть, но старые и не поддерживаемые.
Ну а для тех, у кого заблокировано, но очень хочется, всегда есть простые решения
Может я зря для разворачивания сервера вбиваю в консоль
sudo aptitude install postgresql-server erlang nginx git logrotate postfix
и после 20-30 минут редактирую конфиги.Мне почему то кажется, что время, потраченное на изучение API и библиотек всех этих сервисов сравнимо со временем, которое нужно потратить на то, чтобы плюс-минус эквивалентное окружение научиться настраивать самому (или нагуглить подходящие HOWTO).
Особенно комично смотрится изначальное утверждение «поддерживать собственную инфраструктуру слишком дорогое удовольствие» и последующие переезды с сервиса на сервис.
Хоть скажите, не пожалели что с PaaS-ами связывались?
http://example.com/page.html
подменять наhttp://example.com.proxy.indexisto.com/page.html
— тогда достаточно подменять только абсолютные FQDN ссылки (<a href="http://..."
), а относительные (<a href="/page.html"
) будут автоматически наследовать родительский домен и протокол.Ну и многие сайты практикуют детектирование и выпрыгивание из айфреймов, нужно иметь в виду.
stream_set_blocking
да иread
/write
/fgets
у вас используются так, как использовались бы с блокирующими сокетами. Мне кажется они у вас блокирующие…Пример — вызов fgets (его вы уже выпилили) возвращает в 3-х случаях: сокет закрыт, достигнут лимит или найден "\n". Как она работает с неблокирующими сокетами вообще не представляю, но совершенно точно что нужно удостовериться, что последний символ в считанных данных это "\n".
Дальше fwrite: на неблокирующих сокетах он не обязан записывать всё, что ему сказали записать — сколько он запишет зависит от размера буферов, так что нужно делать что-то вроде
и дописывать остаток когда сокет снова станет записываемым.
Насчёт read та же фигня — в неблокирующем режиме он может вернуть хоть один байт (привет
if(!$data)
) хоть всё вплоть до $length. Так что всегда нужно проверять достаточно ли данных считалось и если нет — сохранять в буфер и дожидаться, пока сокет снова станет readable.Тот факт, что сокеты у вас всё-же блокирующие, позволяет, по идее, заблокировать воркера послав, например, всего один байт, в то время как сервер делает
read($fd, 10000)
. Хотя насчёт этого не совсем уверен, возможно в PHP там промежуточные буферы какие то есть.