За последние 24 часа нас посетил 21841 программист и 1024 робота. Сейчас ищут 674 программиста ...

Внутри броузерных игр или как оно все устроено.

Тема в разделе "Прочие вопросы по PHP", создана пользователем 440Hz, 4 авг 2010.

  1. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Padaboo
    1
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    а для соц сети такая архитектура подойдет?
     
  3. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    врят ли. там же специфика. вот решения некоторые можно использовать, а саму архитектуру. не. врят ли...
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Спасибо, поржал! (не в обиду сказано).
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    1 точка - веб, 2 - ajax, 3 - API, не? Если точка веб-доступа всего лишь "роутер"?
     
  6. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Psih
    скажи лучше, что сам используешь
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    вы про что ваще?
     
  8. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    440Hz
    Игра внешне сильно похожа на поделки IT Territory (Astrum Online, а теперь Mail.Ru). Вы случайно с ними не заодно? :)
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Padaboo
    Для соц. сети своя прослойка для обработки запросов и запуска модулей на стороне сервера. На стороне клиента организована прозрачная AJAX навигация с gracefull degradation (т.е. если JS нету - тоже навигация пашет - боты свободно бегают по открытым частям).

    Для остального пересел на Yii. Идёт хорошо, слазить не буду - будем набивать скилл.
     
  10. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    нет. мы отдельно. майл ру клепает все на одном движке, о чем уже 100 раз писалось в сети.
     
  11. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Psih
    не совсем это имел ввиду, чутка попозже создам тему с 1001 вопросом, по кешированию и масштабированию :)
     
  12. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Да рецепт просто до банальности.


    • * Хранить сессии централизовано, дабы не нарваться на то, что придётся юзеров привязывать к серверу (в моём случае - ArrayObject + memcache (а лучше memcachedb тогда уже - оно хоть перманентно)).
      * Не писать запросов, в которых over 9000 JOIN. Иногда лучше сделать 2 запроса, где делаете SELECT FROM WHERE, а потом SELECT FROM WHERE id IN(....). Особенно не стоит джойнить таблицы, к которым постоянно идёт доступ ото всюду. Банальный пример - таблица юзеров.
      * Не пихать слмшком много индексов, оптимизировать запросы и серебрянная пуля: использовать xtradb пока 5.5 не будет stable (хотя в нём всё равно есть такие вещи полезные, которых нету в официальной ветке - тут уж по ситуации).
      * Заложить интерфейсы по работе с данными, которые тагаются постоянно и везде, которые можно успешно кешировать с большой эфективностью. Опять пример - те же пользователи. Делим сперва на 2 селекта, второй селект оборачиваем в API и вуаля - нам обсалютно пофиг откуда и как делается выборка - скормили ID, получили массив юзеров.
      * Как ни странно - кормите сервер с базой оперативкой и не давайте базе разрастись за пределы оперативки по возможности. Т.е. нужно не тока добавить оперативку, но и не забыть увеличить буфер для иннодб и подтюнить остальные настройки. Если у вас начнёт не хватать памяти для актуальных данных - будете либо в жопе и срочно добавлять оперативку, либо пора начинать шардится. Последнее нужно предусмотреть зарание :)
      * И самое главное правило - пишите код правильно, закладывайте возможности маштабироватся, но не думайте об этом - слишком рано и возможно этим заниматься придётся через год-полтора-два :) Главное - что бы в голове был план действий, когда придёт время озаботится маштабированием.
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а мы вынесли юзеров и все, что можно в демонов. храним и обрабатываем там уже готовые объекты а в БД сбрасываем по таймеру. тем самым БД не напрягается.

    демоны работают по HTTP, через nginx. т.е. вызывающий объект не знает где, что лежит.

    реализован полный РЕСТ, маппер, контроллер и т.д.

    гоняем только JSON.

    ну и много чего вкусного, но уже внутри геймплея.

    к примеру вот так одевается шмотка.

    PHP:
    1.  
    2. <?php
    3.  
    4.         $aData = array ();
    5.         $aData [ 'user_guid' ] = $aUser [ 'users_guid' ];
    6.         $aData [ 'inventory_guid' ] = $oHTTPRequest->get ( 'guid' );
    7.         $aData [ 'slot_id' ] = ( int ) $oHTTPRequest->get ( 'slot' );
    8.  
    9.         $oResult = $oCommand->send ( 'user', 'POST', '/user/inventory/body', $aData , 'application/x-www-form-urlencoded' );
    10.  
    11.  
    в демона летят ГУИД юзера и шмота. далее все происходит в демоне а ответом летят новые параметры юзера и чего там нам еще надо. Все это передается на клиента в JSON. на клиенте шмот перемещается на юзера и все.

    Юзер в демоне помечается как "измененный" и по таймеру все, что надо, ляжет в БД.
     
  14. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    440Hz
    Как говорится - игры и социалки - две разные вещи :)

    Социалки по устройству ближе к простым сайтам, просто с хорошим расширяемым апи и иногда довольно замудрённые :)
     
  15. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    в phpDaemon'е запросы к базе должны быть асинхронными. А тут как я вижу - нет. Как так?
     
  16. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    они асинхронные. для демона написан DbPool, который выдает соединение по мере надобности.
     
  17. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    асинхронные запросы появились в MySQLi начиная с 5.3. Вы его используете или своего клиента писали, как в том же phpD?
     
  18. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    походу мы о разных вещах говорим?

    демон написан свой. с нуля. на php+libevent

    в самом демоне есть пул коннектов БД, и при необходимости из него выдается свободный коннект.
     
  19. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    да, о разных.

    Вот код из примера phpD. Один воркер может одновременно обрабатывать много запросов.

    PHP:
    1. <?php
    2.     $sql->query('SHOW VARIABLES', function($sql,$success) // то, что будет выполнено когда результат запроса будет "готов"
    3.     {
    4.      $sql->context->queryResult = $sql->resultRows; // save the result
    5.      $sql->context->wakeup(); // wake up the request immediately
    6.     });
    то есть мы не пишем
    $result = $sql->query('SHOW VARIABLES'); , так как это будет выполняться не асинхронно и будет блокировать наш процесс.
     
  20. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    phpDaemon насколько я знаю не писали с помощью libevent и он не есть труЪ асинхронный.
     
  21. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    http://github.com/kakserpom/phpdaemon
    http://wiki.github.com/kakserpom/phpdaemon/install
     
  22. Romzess

    Romzess Активный пользователь

    С нами с:
    11 июн 2008
    Сообщения:
    30
    Симпатии:
    0
    440Hz

    а какой движок для таблиц бд используется у вас?