PHP优化实战2011-05-17

1. 公用缓存增加文件缓存,减少MC请求数量

MC本来是为降低数据库负载而使用的高速缓存。但是相对于前端机来说,MC更像是集中式的服务器。在高并发尤其是流量洪峰到来时,也容易成为系统的瓶颈之一。

相比MC,前端机数量更多,文件负载非常低,读取文件的时间并不比走MC的网络时间长。可以考虑在MC缓存之前再增加一级文件缓存。从MC读取过数据后,保存到文件里。下次再读取数据时,先检查数据文件是否存在,文件是否超过过期时间。如果都正常直接读取数据库的文件,JSON解码后直接返回,不再走MC。如果读取不到数据再走MC,然后JSON编码后保存到文件。

走文件缓存的前提是,数据必须是公用的,而不是基于单个用户的分散的数据。

文件缓存的一个问题是不能及时更新。因为文件分散在每一台前端机上,做一个通知推送处理系统显然成本又太高。有两个相对简单的办法。

a) 修改配置文件,设置一个时间戳。每次读取文件时,除了检查文件是否达到过期时间,还要检查是否没有达到这个时间戳。如果没有达到,则更新文件。

b)为所有数据文件做一个统一的版本控制。这需要有后台推送文件,成本相对较高,但是易于控制。JSON编码时,数据为array(‘version’=>3, ‘data’=>$data)。version是当前数据的版本好,$data才是真实的数据。每次读取时,JSON解码后检查版本是否小于版本,小于的话更新文件。

2. 异步请求改为同步输出

之前为了减少响应时间。做了很多复杂的功能,使用异步加载的方式加载一些资源消耗多、不是特别重要的功能(有点类似于bigpipe)。这样的问题是,一个主页面的请求,实际上带来了成倍的请求量,反而增加了系统的负载。

针对于每次都必须显示的内容,例如评论转发数、关注粉丝数等,同步输出自然会减少请求量和负载。但是前提是这些内容需要的资源必须经过优化,否则响应时间会很长,用户体验差。

有些异步请求,例如用户参与的操作,加减关注、修改分组信息等,并不是每次加载主页面都一定要用到,所以写成异步请求更好一些。

所以,一些不常用到的操作,是由同步输出改为了异步加载的方式。

发表评论

电子邮件地址不会被公开。

*