【问题标题】:How to implement server side caching with PHP如何使用 PHP 实现服务器端缓存
【发布时间】:2012-01-23 13:55:09
【问题描述】:

对于基于浏览器的 Flex 游戏(用于 Facebook 平台),我使用 PHP 和 MySQL 进行服务器端编程和保存数据(使用 amfPHP)

由于我对游戏开发和 PHP 都非常陌生,并且我希望看到我的游戏能够运行,所以我编写了所有服务器端编码(amfPHP 服务),其中包含非常丑陋和肮脏的代码,这些代码会在数据库中获取,更新游戏状态(包括玩家统计数据和库存)。

肯定效率不高,所以我开始寻找 PHP 中实现缓存的最佳方法。通过缓存,我的意思是我不想一直点击数据库来保存玩家的最新游戏状态,而只是在会话结束时保存(当玩家离开应用程序时)。

通常情况下,我的游戏/应用流程是这样的

  • 玩家从 FB 启动应用/游戏
  • 身份验证
  • 加载用户会话(之前保存的游戏状态)。这包括获取用户统计信息,例如他有多少能量、硬币、经验等、他的库存、当前活动任务等,以及市场项目、优惠等静态信息,滴等。
  • 当游戏发生一些变化时更新游戏状态,最常见的是当用户点击某些建筑物来收集、消耗能量、添加硬币、给予经验或奖励等。

现在,对于所有玩家来说,很少有通用数据可以作为收益,例如“市场物品及其价格和图形资产等”,并且有玩家特定的数据。

我有一些想法,我需要专家帮助我认为是好是坏,或者是否有更好的方法?

将静态(通用)数据永久保存在缓存中,并有一个管理面板来清除/更新 身份验证后,取回数据并保存在缓存中(作为 JSON 对象),直到会话结束的所有读/写都将完成到缓存中,会话结束后,将缓存数据保存到数据库中。

这里我想使用 APC。你觉得靠谱吗?

我想,在最坏的情况下,当网络服务器崩溃时,所有缓存数据都会丢失,所以我想将它们保存在会话中,但我认为 PHP 将它们保存在文件中,这意味着会有很多 I/ O 又不推荐哪个?还是可以接受?

我也在想将游戏状态保存在序列化对象中有多好?

【问题讨论】:

    标签: optimization php


    【解决方案1】:

    您是否分析过您的应用程序并将数据库确定为瓶颈?似乎您正在尝试优化最有可能根本不是问题的事物。

    从数据库中获取数据非常快。写入 DB 可能会慢一些,尤其是在使用事务的情况下。但是数据库仍然可以轻松地处理每秒大量的写入/更新调用。

    看起来您正在做一些过早的优化,这会降低整个游戏的安全性和稳定性。这根本不值得,除非您确实将写入 DB 确定为性能瓶颈。再说一次,您真的不想丢失用户进度,因为您的会话被破坏了。那么最好看看NoSQL 这样的东西。

    【讨论】:

    • 我预计在高峰期会有大约 30-50K 的并发用户在玩这个游戏。 DB仍然可取吗?感谢 NoSQL,但我可能不会选择它,这对我来说可能是另一种学习。
    • 并发用户的数量不会那么重要。这取决于您将要获得的数据库事务的数量......在大多数情况下,数据库系统也是可扩展的。因此,虽然您的代码可能比一个数据库快,但它的扩展性不如数据库(您可以切换到数据库集群等)。
    • @dev2dev 您可能会考虑使用 PostgreSQL(免费)、Oracle 或 MsSQL。关键性能补丁(例如查询优化器)目前仅在 MySQL 实验版本中;当您拥有真正的高规模时,像体面的优化器和分区视图/表之类的东西会产生很大的不同。
    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 2020-09-12
    • 2011-12-07
    • 1970-01-01
    • 2019-11-23
    • 2020-10-28
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多