有个PHP的系统,没用什么框架,只用了点smarty,
现系统图片多,内容多,上面的老大想让我从缓存入手,
把系统变快点,现系统中有用到$_SESSION['user'] = $username;
其它大都是取数据库方面 的东西,(可弄个单独的文件cache文件,让其它文件调用)
大家帮我想想怎么弄,最好是贴个可用的代码,谢谢

解决方案 »

  1.   

    如果是不对现存系统做改动的前提,
    静态内容流量比较多,可以考虑Apache mod_cache
    数据方面,只能是从数据库优化方面下手。
      

  2.   

    define('CACHE_ROOT', dirname(__FILE__).'/cache');
    //缓存文件的生命期,单位秒,86400秒是一天
    define('CACHE_LIFE', 300);
    //缓存文件的扩展名,千万别用 .php .asp .jsp .pl 等等
    define('CACHE_SUFFIX','.cache');
    //清除全部缓存文件所需的密码md5值
    define('CLEAN_ALL_PASSWORD','60645f9c8e8862725798d9dccf07c885');
    //缓存文件名
    $file_name  = md5($_SERVER['REQUEST_URI']).CACHE_SUFFIX;
    //缓存目录,根据md5的前两位把缓存文件分散开。避免文件过多。如果有必要,可以用第三四位为名,再加一层目录。
    //256个目录每个目录1000个文件的话,就是25万个页面。两层目录的话就是65536*1000=六千五百万。
    //不要让单个目录多于1000,以免影响性能。
    $cache_dir  = CACHE_ROOT.'/'.substr($file_name,0,2);
    //缓存文件
    $cache_file = $cache_dir.'/'.$file_name;
    //回调函数,当程序结束时自动调用此函数
    function auto_cache($contents)
    {
        global $cache_file;
        //加一个清空缓存的选择
        $fp = fopen($cache_file,'wb');
        flock($fp,LOCK_EX);
        fwrite($fp, $contents);
        flock($fp,LOCK_UN);
        fclose($fp);
        chmod($cache_file,0777);
        //生成新缓存的同时,自动删除所有的老缓存。以节约空间。
        clean_cache();
        return $contents;
    }
    function clean_cache($clean_all=false)
    {
        if($clean_all)
        {
            if(!isset($_SERVER['PHP_AUTH_USER']) || md5($_SERVER['PHP_AUTH_PW'])!=CLEAN_ALL_PASSWORD)
            {
                header('WWW-Authenticate: Basic realm="需要身份验证"');
                header('HTTP/1.0 401 Unauthorized');
                sleep(3);
                die('清空全部缓存需要密码');
            }
            else
            {
                sleep(1);
            }
        }
        chdir(CACHE_ROOT);
        foreach (glob("*/*".CACHE_SUFFIX) as $file)
        {
           if($clean_all || time()-filemtime($file)>CACHE_LIFE)
           {
               unlink($file);
           }
        }
    }
    //GET方式请求才缓存,POST之后一般都希望看到最新的结果
    if($_SERVER['REQUEST_METHOD']=='GET')
    {
        //如果缓存文件存在,并且没有过期,就把它读出来。
        if(file_exists($cache_file) && time()-filemtime($cache_file)<CACHE_LIFE)
        {
            $fp = fopen($cache_file,'rb');
            flock($fp,LOCK_SH);
            fpassthru($fp);
            flock($fp,LOCK_UN);
            fclose($fp);
            die;
        }
        elseif(!file_exists($cache_dir))
        {
            if(!file_exists(CACHE_ROOT))
            {
                mkdir(CACHE_ROOT,0777);
                chmod(CACHE_ROOT,0777);
            }
            mkdir($cache_dir,0777);
            chmod($cache_dir,0777);
        }
        //缓存不能只建立一半,需要无视用户的取消。
        ignore_user_abort();
        //回调函数 auto_cache
        ob_start('auto_cache');
    }
    else
    {
        //不是GET的请求就删除缓存文件。
        if(file_exists($cache_file))unlink($cache_file);
        //如果post了clean_all就清空全部缓存
        if(isset($_POST['clean_all']))clean_cache(true);
    }
      

  3.   

    上面是我的cache.php,这种方法会生成个新的页面来存信息,
    下面是我在我要加快速度的页面中调用
    require_once('cache.php');
    这样会页面会快些,可系统中的session就全没了,
    所以这种方法有点问题,大家帮我修改修改或,想想其它的方法,
      

  4.   

    系统的瓶颈在哪里?页面图片多? 造成请求多? 设置apache Expires和Etag ? 增加图片服务器,分摊压力img1.xxx.com,img2.xxx.com....数据库压力大? 页面缓存变量缓存memcache...页面loding慢?js css文件压缩。。合并ui图片置于ui.xxx.com...上?或者再分细一点?  或者添加web服务器+负载均衡?带宽限制?增加带宽?
      

  5.   

    回 5楼,
    图片也用url形式放在数据库中,
    页面内容也是放在数据库中,
    慢的原因就是取数据库中的东西,再显示到页面上慢,
      

  6.   

    不知你为什么要自己写?
    smarty 已经提供了缓存功能,为什么不用?
      

  7.   

    那你全站静态吧。php直接生成html。这样对数据库压力小很多。前提是你的后台数据变化不是很频繁。
      

  8.   

    数据库方面看看页面上的sql,哪些sql查询比较慢 调试下sql,优化索引,尽量不要用 select * 只取用到的数据
    不上memcache的话,添加cache,没有实时更新的页面,整个页面cache掉,其他的可以cache变量
    不知道smarty的cache怎么样,一定可以设置的吧页面慢的话,图片太多太大,用户带宽限制 也是没办法的
    设置设置apache Expires和Etag 
    压缩js css,合并ui图片应该还是很容易做的。。
      

  9.   

    页面图片多造成请求多是关键,另外session就全没了什么意思
      

  10.   

    按看你的問題主要是圖片內容多,不是數據庫的原因,即使全部生成靜態的速度也快不了多少。能做的就是做SQL緩存
      

  11.   

    1.你的cache是在给什么数据作cache?模板的缓存已经有smarty在做了,你的cache在干什么?
    2.图片数据到底保存在什么地方?数据库中还是服务器的文件系统?
    3.具体到页面的什么内容保存在数据库中?整个HTML还是局部的动态内容。
    如果瓶颈在这里,可以考虑两个方面:
    1.PHP和数据库连接层的优化
    2.数据库操作SQL的优化
    如果明白我所说意思的话,具体介绍一下。
      

  12.   


    你看下我的那cache.php页面,他会把以前的缓存文件先清掉,
    再生成一个新缓存,并会存在一个记事本中,并有时间控制的,
    每多少时间生成一回,所以session就会清掉呀,