Как реализовать кэширование на стороне сервера с помощью PHP


Для моей браузерной игры Flex (для платформы Facebook) я использую PHP и MySQL для программирования на стороне сервера и для сохранения данных (с использованием amfPHP)

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

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

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

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

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

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

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

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

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

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

Author: Solow Developer, 2012-01-23

1 answers

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

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

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

 4
Author: bummzack, 2012-01-23 14:17:47