ECOS百科全书|高级搜索|RSS订阅|加入收藏|服务中心|联系我们欢迎您光临!

B2B2C性能优化实战之二

来源:未知 发布时间:2018-07-26 12:51 字体:【   点击

在上一篇文章《ONex B2B2c性能优化实战之一》中我们解决了sphinx性能屏颈问题,把网站打开速度从9秒多提升到了4秒左右,但这还不够。这一篇文章,我们将继续深挖b2b2c性能屏颈,实现网站秒开。


解决了sphinx的问题,清风的运维小哥又继续分析慢日志,但在mysql慢日志中再无有价值的收获。于是转头分析系统本身使用的组件和机制(中间过程再省略一万字)。在观察缓存情况时,发现了如下现象:

6.jpg

ONex B2B2C使用了Redis做缓存系统,由上图可见,打开首页index.html时,首页模板挂件缓存都没有命中(value值都为空)。缓存的作用,是将已查询和访问过的资源临时存储起来,供下一次访问使用,以减少mysql和服务器压力,并可极大的提高访问速度。由于模板挂件没有被缓存,导致每次打开网页时,都需要再次向mysql查询和输出结果,网站的响应速度会受比较大的影响。


但是,ONex B2B2C默认是支持对模板挂件缓存的,为什么在这里失效了呢?第一反应,是客户网站关闭了缓存功能。


打开config/production/cache.php,果不其然,缓存功能处于关闭状态:

cache.jpg

注:enabled为false时,缓存为关闭状态,为true时,则是开启状态。


既然客户关闭了缓存,那我们开启行不行?一般情况下,处于开发阶段的网站,开发人员出于调试的需要,会关闭掉缓存,以便让修改的内容实时生效。这种情况 下将enabled改为true即可。但是有些做了深度开发的网站,关闭缓存可能是一些特殊功能的需要。比如清风的这个客户,请第三方公司在B2B2C基础上开发了多语言和多币种切换功能,需要根据客户的选择输出不同的首页内容呈现给终端用户。直接把enabled改为true,结果内页都报503错误了。


如下图:

503.jpg

如果要解决问题,应该把这些功能按正规的方法进行修改,以便让不同语言版本和币种页面能被缓存到,但这无疑要增加开发成本,甚至原有功能可能推倒重来。这是费时费力的事情,暂不在本次讨论范围。


那是不是没有办法提升速度了呢?当然不是的。在cache.php文件中有这样一段提示:

未标题-4.jpg

当设置缓存关闭的时候,可以让某些内置应用忽略掉关闭设置,也就是说指定的应用的缓存将继续生效。系统默认只设置了session、vcode、sysuser忽略系统缓存设置,我们可以让模板挂件也忽略掉缓存设置。


在43行左右,添加"theme-widgets",注意前面要加上英文半角逗号。

未标题-5.jpg


并在98行左右,把“theme-widgets”的"resource"设置为"local":

未标题-6.jpg


最后再来看下优化结果:

未标题-7.jpg


网页打开速度已经提升到了0.6秒左右,网页已经能秒开了。


但问题又来了,不久,客户反馈说开发的多币种功能不能切换显示对应的货币了。

未标题-9.jpg


再来看这个模板挂件代码:

未标题-8.jpg

如上图所示,客户原先的第三方开发者,把货币币种和金额的换算输出直接写在了挂件的代码中(非常不推荐这么做,多币种的功能逻辑应该在底层中去统一处理,而不是分散在各个应用层),导致内容直接被缓存为第一次打开时显示的界面了。既然如此,那我们增加对多币种页面的缓存。


在“/app/base/lib/cache/repository.php”这个文件中167行左右加下红圈中代码:

未标题-12.jpg

注:以上仅提供一个思路,不同的功能环境需求不一致,请不要直接复制。


币种问题顺利解决,多语言功能也可以参考这种方法使不同语言版本页面能被缓存到。


当然,页面打开速度还是可以继续通过优化底层代码、前端脚本、lnmp环境继续提升。在此就不一一赘述了。有兴趣的,可以加我QQ9516097一起探讨一下。

------分隔线--------

关键词:ONex B2B2c,性能优化,缓存不命中,打开慢的处理

转载请保留:http://www.hnqss.cn/html/jszx/b2b2c/article-2829.html

------分隔线--------