如何使用PHP实现服务器端缓存


How to implement server side caching with PHP

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

由于我对游戏开发和PHP都很陌生,并且我想看到我的游戏运行,我已经用非常丑陋和肮脏的代码编写了所有服务器端编码(amfHP服务),这些代码会进入数据库进行获取、更新游戏状态(包括玩家统计数据和库存)。

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

通常,我的游戏/应用程序流是这样的

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

现在,几乎没有什么是对所有玩家都有利的通用数据,比如"市场项目及其价格和图形资产等",还有玩家特定的数据。

我脑子里有一些想法,我需要专家的帮助来判断我的想法是好是坏,或者是否有更好的方法?

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

在这里我想使用APC。你认为它可靠吗?

我想,在最坏的情况下,当Web服务器崩溃时,所有的缓存数据都会丢失,所以我想把它们保存在会话中,但我认为PHP将它们保存在文件中,这意味着会有很多I/O,这也是不建议的?或者这可以接受吗?

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

您是否对应用程序进行了评测并将DB确定为瓶颈?你似乎在试图优化那些很可能根本不是问题的事情。

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

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