V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
richiefans
V2EX  ›  问与答

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

  •  
  •   richiefans · 2013-11-22 20:38:14 +08:00 · 4366 次点击
    这是一个创建于 4030 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前在用的一个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  
       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   ·   实用小工具   ·   5873 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:38 · PVG 10:38 · LAX 18:38 · JFK 21:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.