2012-01-23 3 views
5

Для моего браузера на основе игры Flex (для платформы Facebook), я использую PHP и MySQL для стороне сервера программирования и для сохранения данных (с использованием AMFPHP)Как реализовать кэширование на стороне сервера с помощью PHP

Так как я был очень новый и для разработки игр, и для PHP, и я хотел, чтобы моя игра работала, я написал все серверные кодировки (amfPHP-сервисы) с очень уродливым и грязным кодом, который попадает в БД для извлечения, обновляет состояние игры (включая игроков статистика и инвентарь).

Определенно, это неэффективно, поэтому я начал искать лучший способ, доступный в PHP для реализации кэширования. Кэшированием я имею в виду, что я не хочу постоянно ударять по БД, чтобы сохранить последнее игровое состояние игрока, но просто сохранить в конце сеанса (когда игрок покидает приложение).

Как правило, моя игра/приложение потока, как это

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

Теперь есть несколько вещей, которые являются общими данными для всех игроков, таких как «рыночные позиции и их цены и графические активы и т. Д.», И есть конкретные данные игрока.

У меня есть идеи в моем сознании, и мне нужна помощь экспертов в том, что я думаю, хорошо или плохо, или если есть лучший способ?

Сохранять статические данные в кэше и иметь панель администратора для очистки/обновления. После аутентификации извлеките данные и сохраните их в кеше (как объекты JSON), а все чтение/запись до окончания сеанса сделать в кэш, после окончания сеанса, сохранить данные кэша в БД.

Здесь я хочу использовать APC. Считаете ли вы его надежным?

Я думаю, в худшем случае, когда веб-сервер выйдет из строя, все данные кэша будут потеряны, поэтому я решил сохранить их в сеансе, но я думаю, что PHP поддерживает их в файлах, что означает, что будет много I/O, что опять не рекомендуется? Или это будет приемлемо?

Я также думаю, насколько хорошо сохранять состояние игры в сериализованных объектах?

ответ

4

Профилируйте свою заявку и определили БД как узкое место? Похоже, вы пытаетесь оптимизировать вещи, которые, скорее всего, не являются проблемой вообще.

Получение данных из БД происходит очень быстро. Запись в БД может быть немного медленнее, особенно если вы используете транзакции. Но БД все еще может обрабатывать множество вызовов записи/обновления в секунду.

Похоже, вы делаете некоторую преждевременную оптимизацию, которая снизит безопасность и стабильность всей вашей игры. Это просто не стоит того, если вы действительно не определили запись в БД как узкое место в производительности.Опять же, вы действительно не хотите потерять прогресс пользователя, потому что ваш сеанс будет уничтожен. Лучше посмотрите на что-то вроде NoSQL.

+0

Я ожидаю, что около 30-50K одновременных пользователей играют в эту игру на пике. Будет ли БД по-прежнему целесообразным? Спасибо за NoSQL, но я, возможно, не выбираю для него, что может быть другим для меня. –

+0

Количество одновременных пользователей не будет таким важным. Это зависит от количества транзакций БД, которые вы собираетесь получить ... Кроме того, в большинстве случаев системы БД масштабируемы. Таким образом, хотя ваш код может быть быстрее, чем один DB, он не будет масштабироваться, а также DB (где вы можете переключиться на кластер DB и т. Д.). – bummzack

+0

@ dev2dev вы можете рассмотреть PostgreSQL (бесплатно), Oracle или MsSQL. Критические патчи производительности (например, оптимизатор запросов) находятся только в экспериментальных сборках MySQL на данный момент; такие вещи, как приличный оптимизатор и секционированные представления/таблицы, имеют большое значение, когда у вас действительно высокие масштабы. –

Смежные вопросы