PHP 如何利用缓存加速网站加载

(一)、缓存的三要素

            1、命中率

             命中率:请求次数与缓存返回正确结果的比例,比例越高,缓存命中率越高;

            2、缓存更新策略  

            总结以下几种

            · FIFO  先进先出策略;

            · LFU  最少用,最先清除策略;

            · LRU  最近最少使用最先清除策略;   

            3、缓存的最大数据量         

            缓存中能处理元素的最大个数或者所能使用的最大存储空间。

 

(二)、PHP  文件缓存    

            php文件缓存指将缓存数据存入文件系统,相比内存,硬盘空间大而廉价,并且简单可靠。

            代码可参考如下:

<?php
class Cache{

    /**
     * 渲染数据
     *
     * @var array
     */
    public $value=[];

    /**
     * 配置列表
     *
     * @var array
     */
    public $arrayConfig=[
        //是否开启缓存
        'cache_html'=>false,
        //缓存目录
        'cache_dir'=>'',
        //缓存目录后缀
        'suffix_cache'=>'',
        //模板目录
        'templateDir'=>'',
        //模板文件后缀
        'suffix'=>'',
        //缓存有效期
        'cache_time'=>''
    ];


    //返回编译文件名,存在路径处理
    public function path()
    {
        return $this->cache_file=$this->arrayConfig['cache_dir'].$this->file.$this->arrayConfig['suffix_cache'];
    }

    //开始编译
    public function complie()
    {
        //获取缓冲区内容
        $this->message=ob_get_contents();
        //保存内容
        @file_put_contents($this->path(),$this->message);
    }

    /**
     * 显示模板
     *
     * @param string 模板名
     * @return void
     */
    public function show($file)
    {
        $this->file=$file;
        //模板文件路径
        $PIG_TPL_FILE=$this->arrayConfig['templateDir'].$file.$this->arrayConfig['suffix'];
        //判断文件是否过期
        if(is_file($this->path()))
        {
            $old=$_SERVER['REQUEST_TIME']-filemtime($this->path())>=$this->arrayConfig['cache_time']?1:0;
        }
        else
        {
            $old=0;
        }
        //静态编译开启
        if($this->arrayConfig['cache_html'])
        {
            //静态文件存在并且未过期
            if(is_file($this->path())&&!$old)
            {
                readfile($this->path());
            }
            else
            {
                if(is_file($PIG_TPL_FILE))
                {
                    ob_start();
                    extract($this->value);
                    include($PIG_TPL_FILE);
                    $this->complie();
                }
                else
                {
                    die('找不到模板文件!');
                }
            }
        }
        //静态编译关闭
        else
        {
            if(is_file($PIG_TPL_FILE))
            {
                extract($this->value);
                include($PIG_TPL_FILE);
            }
            else
            {
                die('找不到文件!');
            }
        }
        //内容输出
        ob_flush();
        flush();
    }
}

 

(三)、PHP程序编译加速 

             PHP通常是多进程服务规则。所以程序的规则多半是 调用-运行-清理  但是问题的关键在于每次都需要php的解析器翻译php语言编程opcode

            在进行编译。如何解决这个重复的问题 也是加载网页效率的关键

            目前可用的php程序缓存可参考 opcache   安装过程不赘述。描述一下配置信息

[opcache]
zend_extension=/Applications/MxSrvs/bin/php/lib/php/extensions/no-debug-non-zts-20170718/opcache.so
; 启动操作码缓存
opcache.enable=0
; 针对支持CLI版本PHP启动操作码缓存 一般被用来测试和调试
opcache.enable_cli=1
; 共享内存大小,单位为MB
opcache.memory_consumption=128
; 存储临时字符串缓存大小,单位为MB,PHP5.3.0以前会忽略此项配置
opcache.interned_strings_buffer=8
; 缓存文件数最大限制,命中率不到100%,可以试着提高这个值
opcache.max_accelerated_files=4000
; 一定时间内检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 单位为秒
opcache.revalidate_freq=60
; 开启快速停止续发事件,依赖于Zend引擎的内存管理模块,一次释放全部请求变量的内存,而不是依次释放内存块
opcache.fast_shutdown=1
;启用检查 PHP 脚本存在性和可读性的功能,无论文件是否已经被缓存,都会检查操作码缓存,可以提升性能。 但是如果禁用了 opcache.validate_timestamps选项, 可能存在返回过时数据的风险。
opcache.enable_file_override=1

            利用VLD查看opcache的命中和效率 

            git clone https://github.com/derickr/vld.git

            cd vld

            phpize

            ./configure

            make && make install

            具体怎么使用可自行百度;

 

(四)、客户端缓存 

            Expires :过期时间 

            在php脚本中加入过期时间头,当网站再次被加载时,查看net 有明显 cache from disk 标识

            ps : 这里的过期时间未 格林威治时间 。 例 Expires : Fri ,30 Oct 1998 14:19:41 GMT

            Cache-Control : 缓存控制

            max-age: 缓存过期时间, 通常为未来的某个时间段对应的时间戳

            no-cache : 强制每次请求发送给服务器

            no-store : 禁止缓存保留副本

            must-revalidate :检查文件是否新鲜

            Last-Modified :最后修改时间      

            加入此请求头,客户端第二次请求时,会传送一个If-Modified-Since的请求头,验证在此之间是否发生文档修改

            如何利用客户端缓存

            · 图片启用 cache-control :max-age 给一个很长的时间;

            · 定期更新的部分设置一个合理的 max-age 时间;

            · 尽量避免post ,post 数据服务器一般不会缓存;

            · 不要在url 中加入任何敏感信息;

            php如何设置当前页面缓存

<?php

//设置页面有效期24小时,请求时检查新鲜度
header('Cache-Control:max-age=86400,must-revalidate');

//文档更新时间
header('Last-Modified:'.gmdate('D,d M Y H:i:s',time()+'86400').'GMT');

//过期时间
header('Expires:'.gmdate('D,d M Y H:i:s',time()+'86400').'GMT');

//三者可共用,也可以选择一种缓存策略来使用

                            

 

转载于:https://my.oschina.net/u/4173863/blog/3080411

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值