• PHP 缓存技术


    缓存已经成了项目中是必不可少的一部分,它是提高性能最好的方式,例如减少网络I/O、减少磁盘I/O 等,使项目加载速度变的更快。

    磁盘IO(输入/输出)主要的延时是由(以15000rpm硬盘为例): 机械转动延时(机械磁盘的主要性能瓶颈,平均为2ms) + 寻址延时(2~3ms) + 块传输延时(一般4k每块,40m/s的传输速度,延时一般为0.1ms) 决定。(平均为5ms)

    而网络IO主要延时由: 服务器响应延时 + 带宽限制 + 网络延时 + 跳转路由延时 + 本地接收延时 决定。(一般为几十到几千毫秒,受环境干扰极大)

    所以两者一般来说网络IO延时要大于磁盘IO的延时。

    缓存可以是CPU缓存、内存缓存、硬盘缓存,不同的缓存查询速度也不一样(CPU缓存 > 内存缓存 > 硬盘缓存)

    一:浏览器缓存

    浏览器将请求过的页面存储在客户端缓存中,当访问者再次访问这个页面时,浏览器就可以直接从客户端缓存中读取数据,减少了对服务器的访问,加快了网页的加载速度。

    强缓存

    用户发送的请求,直接从客户端缓存中获取,不请求服务器。

    根据 Expires 和 Cache-Control 判断是否命中强缓存。

    代码如下:

    header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT');
    header("Cache-Control: max-age=3600"); //有效期3600秒

    Cache-Control 还可以设置以下参数:

    • public:可以被所有的用户缓存(终端用户的浏览器/CDN服务器)
    • private:只能被终端用户的浏览器缓存
    • no-cache:不使用本地缓存
    • no-store:禁止缓存数据

    协商缓存

    用户发送的请求,发送给服务器,由服务器判定是否使用客户端缓存。

    代码如下:

    $last_modify = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
    if (time() - $last_modify < 3600) {
        header('Last-Modified: '. gmdate('D, d M Y H:i:s', $last_modify).' GMT');
        header('HTTP/1.1 304'); //Not Modified
        exit;
    }
    header('Last-Modified: '. gmdate('D, d M Y H:i:s').' GMT');

    二:文件缓存

    数据文件缓存

    将更新频率低,读取频率高的数据,缓存成文件。

    比如,项目中多个地方用到城市数据做三级联动,我们就可以将城市数据缓存成一个文件(city_data.json),JS 可以直接读取这个文件,无需请求后端服务器。

    全站静态化

    CMS(内容管理系统),也许大家都比较熟悉,比如早期的 DEDE、PHPCMS,后台都可以设置静态化HTML,用户在访问网站的时候读取的都是静态HTML,不用请求后端的数据库,也不用Ajax请求数据接口,加快了网站的加载速度。

    静态化HTML有以下优点:

    • 有利于搜索引擎的收录(SEO)
    • 页面打开速度快
    • 减少服务器负担

    CDN缓存

    CDN(Content Delivery Network)内容分发网络。

    用户访问网站时,自动选择就近的CDN节点内容,不需要请求源服务器,加快了网站的打开速度。

    缓存主要包括 HTML、图片、CSS、JS、XML 等静态资源。

    三:NoSQL缓存

    四:WEB服务器缓存

    Apache缓存

    利用 mod_expires ,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。

    打开 http.conf,开启模块:

    LoadModule expires_module modules/mod_expires.so

    指定缓存的过期时间:

    <IfModule expires_module>
         #打开缓存
         ExpiresActive on 
    
         #css缓存(8640000秒=10天)
         ExpiresByType text/css A8640000
    
         #js缓存
         ExpiresByType application/x-javascript A8640000
         ExpiresByType application/javascript A8640000
    
         #html缓存
         ExpiresByType text/html A8640000
    
         #图片缓存
         ExpiresByType image/jpeg A8640000
         ExpiresByType image/gif A8640000
         ExpiresByType image/png A8640000
         ExpiresByType image/x-icon A8640000
    
     </IfModule>

    Nginx缓存

    利用 expire 参数,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。

    打开 nginx.conf :

    //以图片为例:
    location ~.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location
        root html;
        expires 1d; #指定缓存时间
    }

    大家也可以了解下:proxy_cache_path 和 proxy_cache,进行缓存的设置。

    五:Opcode缓存

    Opcode(Operate Code)操作码。

    PHP程序运行完后,马上释放所有内存,所有程序中的变量都销毁,每次请求都要重新翻译、执行,导致速度可能会偏慢。

    当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码。

    操作码 的目地是避免重复编译,减少CPU和内存开销。

  • 相关阅读:
    python
    spice-vdagent
    no ia32-libs
    git conflict
    wget mirror
    docker !veth
    libprotobuff8.so not found
    angular 列表渲染机制
    Java测试技巧
    react组件生命周期
  • 原文地址:https://www.cnblogs.com/flzs/p/12205715.html
Copyright © 2020-2023  润新知