• 页面静态化技术(真静态和伪静态的实现)


    页面静态化技术:就是把一个动态的页面变成一个静态页面,后续用户直接访问静态页面。

    页面静态化技术分为两种:真静态和伪静态。

    • 真静态:把一个动态的页面,转成一个静态的页面,即.html文件。使用ob缓存技术来实现
    • 伪静态:所谓伪静态是从url地址上看是一个静态页面,但是实际上还是对应一个动态页面。使用web服务器的rewrite机制(url的重写机制)来实现。

    一、真静态页面的实现

    1. ob缓存的介绍

    (1) 程序缓存
    程序缓存,缓存的数据是,返回给浏览器的数据(包含头信息主体信息
    程序缓存不能关闭,默认就有的。

    (2) ob缓存
    ob就是 output_buffering:输出缓存,缓存的数据是返回的响应的主体数据,可以自由的关闭打开。
    在请求一个php的过程中,我们实际上经过三个缓存,ob缓存,程序缓存,浏览器缓存。

    注意点:如果开辟了ob缓存,主体数据首先存储到ob缓存里面,头信息要存储到程序缓存(无论是否开启ob缓存),当代码执行完毕后,ob缓存里面的数据刷新(移动)到程序缓存,程序缓存再输出到浏览器缓存中,最后输出内容。

    (3) 如何开启ob缓存。

    方式一:直接在页面中执行ob_start() 函数。

    方式二:在php.ini文件中开启。

    output_buffering = 容量|on|off

    2. ob缓存对应的函数

    函数 说明
    ob_start() 开启 ob缓存,只针对当前页面有效。
    ob_clean() 清空ob缓存里面的数据。
    ob_get_contents() 获取ob缓存里面的数据内容。
    ob_end_clean() 清空ob缓存,并关闭ob缓存。
    ob_flush() 把ob缓存里面的数据,给刷新(移动)到程序缓存,并不关闭ob缓存。
    ob_end_flush() 把ob缓存里面的数据,刷新(移动)到程序缓存,并关闭ob缓存。

    3. 真静态实例

    给一个生存周期,比如说300秒,过了300秒后,要重新生成静态页面。

    如果没有做静态化,并发量是1000,在300秒内,查询数据库多少次。300*1000

    如果做了静态化,并发量是1000,而且缓存周期为300秒,在300秒内,查询数据库多少次?仅仅1次。

     如何给一个页面设置生命周期。

    比如生命周期为300秒,满足什么条件在有效期内。

    创建文件的时间戳+生命周期>当前的时间戳

    真静态-列表页 list.php

    header('content-type:text/html; charset=utf-8');
    mysql_connect('localhost','root','123');
    mysql_select_db('test');
    mysql_query('set names utf8');
    $sql = "SELECT id,title,author,content FROM static LIMIT 10";
    $res = mysql_query($sql);
    ?>
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>真静态-列表</title>
    </head>
    <body>
        <p>访问时间:<?php echo date('Y-m-d H:i:s') ?></p>
        <hr>
        <table>
            <tr>
                <td><strong>ID</strong></td>
                <td><strong>歌曲</strong></td>
                <td><strong>操作</strong></td>
            </tr>
            <?php while ($row = mysql_fetch_assoc($res)) { ?>
            <tr>
                <td><?php echo $row['id'] ?></td>
                <td><?php echo $row['title'] ?></td>
                <td><a href="show.php?id=<?php echo $row['id'] ?>">详细</a></td>
            </tr>
            <?php } ?>
        </table>
    </body>
    </html>

    真静态-详情页 show.php

    $id = $_GET['id'];
    $filename = 'show-id-'.$id.'.html'; // 构建生成静态页面的文件名称
    // 需要一个生存周期,比如说300秒,过了300秒后,就重新生成静态页面。
    if (file_exists($filename) && filemtime($filename)+300>time()) {
        include $filename;
        exit();
    }
    header('content-type:text/html; charset=utf-8');
    mysql_connect('localhost','root','123');
    mysql_select_db('test');
    mysql_query('set names utf8');
    $sql = "SELECT id,title,author,content FROM static WHERE id = $id";
    $res = mysql_query($sql);
    $info = mysql_fetch_assoc($res);
    ob_start(); // 开启ob缓存
    ?>
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>真静态-详情</title>
    </head>
    <body>
        <p>访问时间:<?php echo date('Y-m-d H:i:s') ?></p>
        <hr>
        <a href="list.php">返回</a>
        <h1><?php echo $info['title'] ?></h1>
        <p><?php echo $info['content'] ?></p>
    </body>
    </html>
    <?php
    $content = ob_get_contents(); // 获取ob缓存里面的数据内容。
    file_put_contents($filename, $content); // 把ob缓存里面的数据内容生成静态html文件

    4. 真静态的优缺点

    优点: 1. 速度快 2. 安全性高 3. 利于seo
    缺点:就是占有磁盘空间., 如果过大,对磁盘响应速度有影响

    在什么情况下,建议不要使用真静态

    • 页面的数据更新频繁,最好不要使用真静态(比如股票,基金,等实时报价系统)
    • 会生成海量页面(比如大型论坛 bbs ,csdn)
    • 查询该页面一次后,以后再也不查询该页面.
    • 不愿意被搜索引擎抓取的页面.
    • 访问量小的页面.

    二、伪静态页面的实现

    主要是三个配置:

    • RewriteEngine on 重写引擎开关,一旦开启,所有的重写条件都生效。
    • RewriteCond
    • RewriteRule

    1. RewriteCond 重写条件

    RewriteCond 重写条件,当达到什么条件时,完成重写。

    语法为:RewriteCond 判断依据 条件表达式 [条件标志]

    判断依据可以使用服务器变量。服务器可以得到一些特定信息

    条件表达式,可以为如下形式:

    正则或特殊标识:

    • -f 表示是一个文件。
    • -d 表示是一个目录。

    正则,正则表达式字符串。

    条件标志:

    • [OR] 条件间的或者关系,当出现多个条件时,默认为并且的关系,条件应该是或者的关系下,可以使用OR来表示!
    • [NC] 条件不区分大小写。条件匹配时不区分大小写
    • [OR,NC]

    2. RewriteRule 定义重写规则

    RewriteRule 定义重写规则,哪个地址应该被重写到哪个目标地址。

    语法:RewriteRule 匹配地址 目标地址 [标识]

    匹配的地址:所请求的地址,可使用正则匹配

    目标地址:所重写到的地址,可以使用反向引用!$N表示正则匹配到的第N个子模式!

    比如:RewriteRule goods-id(d+).html goods.php?id=$1

    标志:

    • [NC] 不区分大小写
    • [QSA] 查询字符串追加,在目标地址已经具有get参数时,会将真实请求的get参数追后边。

    3. 伪静态实例

    伪静态-列表页 list.php

    header('content-type:text/html; charset=utf-8');
    mysql_connect('localhost','root','123');
    mysql_select_db('test');
    mysql_query('set names utf8');
    $sql = "SELECT id,title,author,content FROM songs LIMIT 10";
    $res = mysql_query($sql);
    ?>
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>伪静态-列表</title>
    </head>
    <body>
        <p>访问时间:<?php echo date('Y-m-d H:i:s') ?></p>
        <hr>
        <table>
            <tr>
                <td><strong>ID</strong></td>
                <td><strong>歌曲</strong></td>
                <td><strong>操作</strong></td>
            </tr>
            <?php while ($row = mysql_fetch_assoc($res)) { ?>
            <tr>
                <td><?php echo $row['id'] ?></td>
                <td><?php echo $row['title'] ?></td>
                <td><a href="show-id-<?php echo $row['id'] ?>.html">详细</a></td>
            </tr>
            <?php } ?>
        </table>
    </body>
    </html>

    伪静态-详情页 show.php

    $id = $_GET['id'];
    header('content-type:text/html; charset=utf-8');
    mysql_connect('localhost','root','123');
    mysql_select_db('test');
    mysql_query('set names utf8');
    $sql = "SELECT id,title,author,content FROM songs WHERE id = $id";
    $res = mysql_query($sql);
    $info = mysql_fetch_assoc($res);
    ?>
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>真静态-详情</title>
    </head>
    <body>
        <p>访问时间:<?php echo date('Y-m-d H:i:s') ?></p>
        <hr>
        <a href="list.html">返回</a>
        <h1><?php echo $info['title'] ?></h1>
        <p><?php echo $info['content'] ?></p>
    </body>
    </html>

    .htaccess 文件

    <IfModule rewrite_module>
        RewriteEngine on
        RewriteCond %{REQUSET_FILENAME} !-f [NC]
        RewriteRule list.html list.php
        RewriteRule show-id-(d+).html show.php?id=$1
    </IfModule>

    4. [QSA]

    [QSA]查询字符串追加,在目标地址已经具有get参数时,会将真实请求的get参数追后边。

    DEMO源码:https://github.com/chenjiacheng/static-page

  • 相关阅读:
    office 2007
    关于网站爬虫的爬取
    华为交换机默认密码大合集
    一些不错的网站工具箱
    HDU 2023 求平均成绩
    HDU 2056 Rectangles
    HDU 2022 海选女主角
    HDU 2045 不容易系列之(3)—— LELE的RPG难题
    HDU 2042 不容易系列之二
    HDU 2044 一只小蜜蜂...
  • 原文地址:https://www.cnblogs.com/chenjiacheng/p/6522257.html
Copyright © 2020-2023  润新知