关于php预加载数据的性能问题求助 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
richiefans
V2EX    问与答

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

  •  
  •   richiefans 2013-11-22 20:38:14 +08:00 4722 次点击
    这是一个创建于 4416 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前在用的一个cms系统,机制大概是把common数据存放到一个/cache/data/common.php

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

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

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

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

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

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

    后来你这边采用了什么方式解决?
    opennet
        13
    opennet  
       2013-11-24 09:39:56 +08:00
    @richiefans 小的全局文件仍然使用文件缓存,其他的还是从mysql里直接读取,试过APC用户缓存和memcahce,好像对我现在的业务没有任何改变。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1148 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 17:47 PVG 01:47 LAX 09:47 JFK 12:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86