关于php预加载数据的性能问题求助

2013-11-22 20:38:14 +08:00
 richiefans
目前在用的一个cms系统,机制大概是把common数据存放到一个/cache/data/common.php

common.php里面是一个大数组 包含了内部的所有模型、栏目、地区数据等

系统加载的时候就会cache.read这个文件 生成全局的变量比如$CATEGORY,$AREA等等~

由于栏目过多(>5000)导致此文件现在大约10M+了~

现在每一次访问都会去cacheread这个文件造成打开页面时间很长的情况

以下是xhprof的分析图,求助啊
4350 次点击
所在节点    问与答
13 条回复
shiny
2013-11-22 20:40:39 +08:00
有没有装 apc 这类的扩展?
估计 io 是瓶颈,不来点激进的可能还真解决不了。
richiefans
2013-11-22 20:43:14 +08:00
@shiny apc装了的 但是貌似解决不了这个
rwx
2013-11-22 20:45:49 +08:00
把数据分拆成多个小文件按需读取吧,不可能每个请求都需要全部数据吧?
文件缓存对于小数据临时用用还成,一但上了M就是噩梦了,还不如用专门的缓存解决问题来的方便。
richiefans
2013-11-22 20:48:52 +08:00
@rwx现在在考虑 如果把这大文件放到memcache里面呢?不过好想memcache有1mb的限制
rwx
2013-11-22 20:54:17 +08:00
@richiefans memcache开启压缩的话倒也有希望放下,不过真的不考虑拆分吗?就算放memcache也不能直接一个key全load出来吧?
如果一定要这种模式的话,还是redis吧
richiefans
2013-11-22 20:57:03 +08:00
@rwx 主要现在这套程序耦合比较严重 拆分的难度比较大,从长期角度肯定是要拆分+更好的cache方案

redis能满足这类需求吗?之前把redis一直在当带持久化的memcache用呢
rwx
2013-11-22 21:01:21 +08:00
@richiefans 唔。。最起码redis应该能在一个key里面放下这么多数据
不过呢,无论什么样的编码格式,从redis里读数据的IO和解码生成变量,所用的时间都不会比文件缓存更低。。
我以前一个项目就是比较了这些之后,还是拆成了无数个小文件缓存。。
richiefans
2013-11-22 22:05:34 +08:00
@rwx,刚才简单hack了一下代码,发现多几个查询都要比这样读取大cache 性能好很多
yangqi
2013-11-23 00:49:58 +08:00
cache这么大,还是file based,就失去cache的意义了吧。如果设计上没法改变,那至少应该都放到内存里
akira
2013-11-23 08:52:21 +08:00
拆分吧,你迟早要做这个事情的。
或者把数据都丢mc/redis里面,需要的什么数据就取什么数据,而不是全部取出来。
opennet
2013-11-24 09:19:50 +08:00
我也遇到了这个问题,使用的文件缓存,等到了10M左右后,还真不如从MYSQL里直接读取的快。
richiefans
2013-11-24 09:22:29 +08:00
@opennet 是的 现在我也局部改用这种方式 还没有放到mem里 只是直接查询mysql 都要比文件缓存快一些

后来你这边采用了什么方式解决?
opennet
2013-11-24 09:39:56 +08:00
@richiefans 小的全局文件仍然使用文件缓存,其他的还是从mysql里直接读取,试过APC用户缓存和memcahce,好像对我现在的业务没有任何改变。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/90254

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX