美文网首页
网站静态化相关总结

网站静态化相关总结

作者: 宠辱不惊丶岁月静好 | 来源:发表于2018-07-22 14:29 被阅读0次

1、介绍

(1)缓存介绍

1)浏览器缓存:

是保存在浏览器端的缓存,这个缓存我们没有办法控制。在360等卫士的清理下,缓存的时间也是没有保证的。这个缓存默认是保存多少?根据浏览器的不同有所不同。我们可以设置web服务器通知浏览器进行保存!

2)PHP端的缓存:

①:程序缓冲:这是一个PHP自带的缓存机构,我们(程序员)是没有办法控制的。只能知道有这么一个东西,他在我们的操作中起着重要的作用。

②:ob缓冲:这个比程序缓存高级一点,高级的原因是我们可以操作它!在它的上面完成我们静态化的工作。也可以根据你的想像力,实现它可以实现的功能。

ob缓冲,可以有多个,可以没有。程序缓冲,是必须有的。ob缓冲可以进行任意的操作,实现对数据流的处理。

(2)静态化介绍

由ob缓冲生成的静态化概念,叫做真静态化。

真静态就是把PHP动态生成的内容,生成HTML文件。这个时候由于PHP输出的内容都在ob缓冲里面,我们可以获得里面的,保存成一个HTML文件。

真静态的优化:就是可以提升访问量,HTML页面的性能比PHP好。也是由于HTML页面,可以被搜索引擎收录!

由于真静态的概念,就出现了伪静态的概念。

伪静态就是由web服务器实现的功能,从URL的访问方式来看,就是访问一个静态的页面。通过WEB服务器的路由规则,把访问的页面,重新定向到PHP动态页面,这就是伪静态。

整个搜索引擎对HTML页面,也就是静态页面,非常喜欢。收录的非常的快。

搜索引擎:百度,搜狗,360。

如果你的内容要在搜索引擎里面被找到,你的网页内容必须提前被搜索引擎收录。没有收录的是没有办法搜索到的。

使用真静态的时候:是真的有一个index.html页面,可以被直接访问到。

使用伪静态的时候:就真的没有一个index.html页面,这个时候,通过web服务器的路由规则,重新定向到一个你想定向的网页。比如search.php,比如index.php也可以。定向到谁,能定向到谁,根据你的想像力。

(3)压力测试软件介绍

1)找到这个已经安装好的软件:在Apache/bin/下有一个ab.exe,这个就是测试软件,Linux上面安装成功,也是有这个软件的。而且使用方式一模一样 。

2)使用方式,进入到:Apache/bin/目录下,查看帮助信息:ab --help

其中需要知道的是:

-n requests:总的请求数,就是一共要发出去的请求

-c concurrency:并发请求数,就是一次性发出去的请求。

3)使用方法:ab -n 200 –c 50 http://域名/path

4)说明一下参数

有一个值:

Requests per second : 105.72 [#/sec] (mean) //每秒请求的次数【QPS|RPS】

这个点是我们非常重要的数据,这个数据越高越好。每个程序执行耗费的时间越短,这个就越高。

你要告诉别人网站的性能,就告诉它QPS是多少。

5)对于这个压力测试的说明:

宽带的最大传输是限制了你的请求量的。如果要完美测试就应该让你的宽带不成为瓶颈。

很多时候测试宽带都会成为瓶颈。你的网卡是M的。所以我们应该在本地测试。

公司里面的测试,有专门的测试服务器!这些服务器上面会安装很多的测试软件。根据你的需求选择测试软件,进行压力测试。测试的服务器,让网络上都不会成为瓶颈。

如果你的优化都OK了,但是性能还是上不去,就应该去查查原因。IO是成为瓶颈了吗?

注意:测试的时候,千万不要只测试一次,应该多测试几次,把结果汇总。去掉有问题的。然后取个平均数来进行说明就可以了。

2、真静态化

(1)ob缓存函数实践

查看ob缓存的函数:

flush — 刷新输出缓冲 //唯一一个可以控制PHP程序缓冲的函数

ob_clean — 清空(擦掉)输出缓冲区

ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲

ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲

ob_flush — 冲刷出(送出)输出缓冲区中的内容

ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓。

ob_get_contents — 返回输出缓冲区的内容

ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。

ob_get_length — 返回输出缓冲区内容的长度

ob_get_level — 返回输出缓冲机制的嵌套级别

ob_get_status — 得到所有输出缓冲区的状态

ob_gzhandler — 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer

ob_implicit_flush — 打开/关闭绝对刷送

ob_list_handlers — 列出所有使用中的输出处理程序。

ob_start — 打开输出控制缓冲

ob开头的,都是控制ob缓冲的内容:

ob_clean :清空ob缓存的内容!

​ 清空是离自己最近的ob缓存!

ob_flush :刷出ob缓存的内容!

​ 刷头是离自己最近的ob缓存。

ob_end_clean :清空ob缓存,并关闭ob缓存

ob_end_flush :刷出ob缓存的内容,并关闭ob缓存

ob_get_contents :获得ob缓存的内容

1)确定现在是不是有默认一个ob缓冲

echo ob_get_level();,如果打印一个1,则是开启缓冲。

2)查看php.ini里面的配置:

配置文件里有一个:output_buffering = 4096 。这个是设置ob缓冲的大小。On是打开,空间很多;Off是关闭

如果要关闭,则修改成output_buffering = Off,重启Apache,再访问刚才页面,会打印0,这就表示没有开启缓冲。

配置默认的值是4096,注意不要修改这个值,因为这个值是最合适的。

3)代码示意:

echo ob_get_levwl();
ob_start();
echo ob_get_level();
ob_start();
echo ob_get_level();
//访问结果:123

4)代码示意

ob_start();     //开启了第二个ob缓冲
echo '123';     //输出到了第二个ob缓冲里面
ob_start();     //开启了第三个ob缓冲
echo '456';     //输出到了第三个ob缓冲里面
ob_start();     //开启了第四个ob缓冲
echo '789';     //输出到了第四个ob缓冲里面
//程序结束了,就要开始回收资源,结束掉程序
//首先关闭第四个ob缓冲,里面的内容就到了第三个ob缓冲里面
//首先关闭第三个ob缓冲,里面的内容就到了第二个ob缓冲里面
//首先关闭第二个ob缓冲,里面的内容就到了第一个ob缓冲里面
//访问结果:123456789

5)代码示意

ob_start();     //开启了第二个ob缓冲
echo '123';     //输出到了第二个ob缓冲里面
ob_clean();     //清空当前缓冲内容
ob_start();     //开启了第三个ob缓冲
echo '456';     //输出到了第三个ob缓冲里面
ob_end_flush(); //刷出当前缓冲的内容,并且关闭它
ob_start();     //开启了第四个ob缓冲
echo '789';     //输出到了第四个ob缓冲里面
//访问结果:456789

6)代码示意

ob_start();     //开启了第二个ob缓冲
ob_clean();     //清空当前缓冲内容
echo '123';     //输出到了第二个ob缓冲里面
ob_start();     //开启了第三个ob缓冲
echo '456';     //输出到了第三个ob缓冲里面
ob_end_flush(); //刷出当前缓冲的内容,并且关闭它
ob_start();     //开启了第四个ob缓冲
echo '789';     //输出到了第四个ob缓冲里面
ob_fulsh();     //刷出到下一个ob缓冲里面
echo '0';
//访问结果:1234567890

7)代码示意

ob_start();     //开启了第二个ob缓冲
ob_clean();     //清空当前缓冲内容
echo '123';     //输出到了第二个ob缓冲里面
//输入的是回调函数名。只要经过ob缓冲就要调用它。刷出:关闭
ob_start('echohr');
echo '456';     //输出到了第三个ob缓冲里面
ob_end_flush(); //刷出当前缓冲的内容,并且关闭它
ob_start();     //开启了第四个ob缓冲
echo '0';

function echohr($content)
{
    return '<hr>' . $content;
}
//访问结果:
123
————————————
4560

8)代码示意

ob_start();     //开启了第二个ob缓冲
ob_clean();     //清空当前缓冲内容
echo '123';     //输出到了第二个ob缓冲里面
//输入的是回调函数名。只要经过ob缓冲就要调用它。刷出:关闭
ob_start('echohr');
echo '456';     //输出到了第三个ob缓冲里面
ob_flush(); //刷出当前缓冲的内容,并且关闭它
ob_start();     //开启了第四个ob缓冲
echo '0';

function echohr($content)
{
    return '<hr>' . $content;
}
//访问结果:
123
————————————
456
————————————
0

9)写一个有意思的代码:

//关闭默认ob缓冲
ob_end_clean();
//输出字符串4096
for($i = 1; $i < 9; $i++)
{
   echo $i;
   echo '<br>';
   echo str_pad('', 4096);
    flush();    //输出程序缓冲的内容
    sleep(1);
}
//访问结果
1
2
3
4
5
6
7
8

修改一下:

//输出字符串4096
for($i = 1; $i < 9; $i++)
{
   echo $i;
   echo '<br>';
   echo str_pad('', 4096);
    //关闭默认ob缓冲
    ob_flush(); //输出ob缓冲的内容
    flush();    //输出程序缓冲的内容
    sleep(1);
}
//访问结果
1
2
3
4
5
6
7
8

效果是一样的

10)非常重要的问题:

ob_end_clean();
echo '123';
header('Content-type:text/html;charset=utf-8');
echo '456';
//访问结果
123
警告信息。。。
456

报错原因说明:header是修改的是http协议内容。所以设置的信息,是直接发送到程序缓冲里面的。header的所有的设置,直接就到达程序缓冲里面。header前面是不能有任何输出内容的。

当你关闭了ob缓冲的时候,php输出的内容,就直接到达了程序缓冲,你在设置header的时候,就发现前面有内容了。既然有内容,也就有了默认的header设置。所以要报错的。

所以默认要开启一个ob缓冲;以后大家一定要注意,header前面不能有任何输出。

(2)ob缓存实现静态化

准备一个动态页面:

echo '<table border="2">';
for($i = 1; $i <= 9; $i++)
{
    echo '<tr>';
    for($j = 1; $j <= $i; $j++)
    {
        echo '<td>';
        echo $i . ' X ' . $j . ' = ' . $i * $j;
        echo '</td>';
    }
    echo '</tr>';
}
echo '</table>';
//上面所有的输出内容,都在ob缓冲里面
//获取到ob缓冲里面的全部内容就可以了
$res = ob_get_contents();
//存储成html页面
file_put_contents('99.html', $res);

运行这个代码后,在浏览器生成99乘法表,同时web目录下生成一个.html这个静态文件,打开这个静态文静,里面的内容和刚才php生成的内容一模一样。

(3)静态化文件的生命周期

我们的访问页面,可以自动的设置生命周期,每一次过期了,都自动就生成一个新的静态化的页面!

什么样的页面才适合生成静态化的页面?

页面的数据很少变化才适合生成静态化的内容,现在很多网站都没有完全的静态化,都是局部静态化。要根据你的网页的情况来进行分析。

过期时间:假如是10秒。获取文件的修改时间:filemtime();

判断文件在不在:file_exists()

计算过期时间:

文件时间 + 过期时间 < 现在时间 : 过期

文件时间 + 过期时间 > 现在时间 : 不过期

代码实践一下:

//定义文件名
$filename = '99.html';
$time = 10;
//不过期就加载页面
if(file_exists($filename) && filemtime($filename) + $time > time())
{
    include $filename;
}else
{
    echo '<table border="2">';
    for($i = 1; $i <= 9; $i++)
    {
        echo '<tr>';
        for($j = 1; $j <= $i; $j++)
        {
            echo '<td>';
            echo $i . ' X ' . $j . ' = ' . $i * $j;
            echo '</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
    //上面所有的输出内容,都在ob缓冲里面
    //获取到ob缓冲里面的全部内容就可以了
    $res = ob_get_contents();
    //存储成html页面
    file_put_contents($filename, $res);
    //为了测试方便,加入下面输出语句,
    //已经过期的文件,会生成新的文件并显示下面的字符,再刷新时,'good'消失,表示还没有过期
    echo 'good';
}

3、伪静态

(1)rewrite的介绍

使用了apache的rewrite规则来实现的效果。是通过apache接收到url之后,去判断这个url。通过判断的结果,重新定向到新的地址,或者新的文件。

这个功能web服务器都是存在的。但是每个web服务器都有一些区别。所以我们理解这些概念,用其它不同的web服务器的时候,就可以做相应的配置了。

比如:http://www.moumou/index.html

通过apache的路由规则,实现访问的页面是index.php的。

(2)rewrite的配置

1)打开扩展文件,位于Apache\conf\httpd.conf

开启模块:LoadModule rewrite_module modules/mod_rewrite.so

2)虚拟主机的配置文件httpd-vhosts.conf里面添加:分布式支持

AllowOverride All添加到<Directory></Directory>里面。

3)准备好分布式文件:

新建文件名:.htaccess

注意:没有办法右键->新建文件生成。 只能使用编辑器,生成这样一个文件!

分布式文件,一定是放在虚拟主机填写的web站点目录下面的。

4)实现:

# 这个是分布式文件,修改了之后,不需要重启apache
# 检查rewrite扩展开启没有;没有开启就不报错
<IfModule mod_rewrite.c>
    #开启rewrite
    RewriteEngine On
    #下面就写规则即可
</IfModule>

5)准备测试文件

.htaccess,一开始生成的99乘法表99.thml,新文件search.php

search.php内容如下:

echo 'HelloWord!';
var_dump($_GET);

(3).htaccess文件:RewriteRule

1)规则:

如果url是index.php的时候,自动访问到search.php页面

# 这个是分布式文件,修改了之后,不需要重启apache
# 检查rewrite扩展开启没有;没有开启就不报错
<IfModule mod_rewrite.c>
    #开启rewrite
    RewriteEngine On
    #下面就写规则即可
    #RewriteRule index.php search.php
</IfModule>

配置完成后,访问:域名/index.php时,会直接显示search.php里的内容。

2)文件名是XXX.html时,访问search.php

# 这个是分布式文件,修改了之后,不需要重启apache
# 检查rewrite扩展开启没有;没有开启就不报错
<IfModule mod_rewrite.c>
    #开启rewrite
    RewriteEngine On
    # 使用正则的时候
    #RewriteRule (.*).html search.php?id=$1
</IfModule>

3)重定向:302临时重定向

# 这个是分布式文件,修改了之后,不需要重启apache
# 检查rewrite扩展开启没有;没有开启就不报错
<IfModule mod_rewrite.c>
    #开启rewrite
    RewriteEngine On
    # R 表示临时重定向
    #RewriteRule index.php /search.php [R]
</IfModule>

4)永久重定向:301

# 这个是分布式文件,修改了之后,不需要重启apache
# 检查rewrite扩展开启没有;没有开启就不报错
<IfModule mod_rewrite.c>
    #开启rewrite
    RewriteEngine On
    # R=301永久重定向
    #RewriteRule index.php /search.php [R=301]
</IfModule>

说明:永久重定向是把定向地址写在了浏览的缓存里面;清了缓存就没有效果了。

重定向在写规则的时候,一定要加/

5)请求参数:

# 这个是分布式文件,修改了之后,不需要重启apache
# 检查rewrite扩展开启没有;没有开启就不报错
<IfModule mod_rewrite.c>
    #开启rewrite
    RewriteEngine On
    # qsa把请求的参数也送过来
    #RewriteRule (.*).php search.php?id=$1 [QSA]
</IfModule>

此时,在url地址输入参数时,输入的参数也会在页面从打印出来,因为search.php里面是var_dump($_GET);

(4).htaccess文件:RewriteCond

RewriteCond :使用这个的时候,可以获取apache里面的变量,把这些变量的值拿来进行匹配。

%{REQUEST_FILENAME} :获得文件路径

%{HTTP_REFERER} :获得url的来源地址

1)规则:判断url文件,或者是目录存不存在。

# 这个是分布式文件,修改了之后,不需要重启apache
# 检查rewrite扩展开启没有;没有开启就不报错
<IfModule mod_rewrite.c>
    #开启rewrite
    RewriteEngine On
    # [NC] 不区分大小写;-f 判断文件;-d判断目录;! 取反
    #RewriteCond %{REQUEST_FILENAME} !-f [NC]
    #RewriteCond %{REQUEST_FILENAME} !-d [NC]
    #RewriteRule (.*).html search.php?id=$1
</IfModule>

请求的url地址,不是目录也不是文件的时候,就走下面的路由。

比如说访问:124325.html,很明显,刚才准备文件时没有准备叫这个名的文件,所以当url地址访问这个路由时,根据配置,会直接跳转到search.php中。

如果访问的路由有该文件,则会访问这个文件。

发现:有文件的时候,是不是就是使用了真静态。

走了路由之后,就是伪静态;伪静态执行代码的时候,就可以根据条件,生成真静态。下一次访问的时候,就真的有页面了。

2)经常会使用的:去掉入口文件

# 这个是分布式文件,修改了之后,不需要重启apache
# 检查rewrite扩展开启没有;没有开启就不报错
<IfModule mod_rewrite.c>
    #开启rewrite
    RewriteEngine On
    
    #RewriteCond %{REQUEST_FILENAME} !-f [NC]
    #RewriteCond %{REQUEST_FILENAME} !-d [NC]
    #RewriteRule (.*) search.php?$1
</IfModule>

访问域名/home/co/act时,还是会跳转到search.php中,同时因为打印$_GET,所以还是在浏览器显示出自己写的/home/co/act路由。

3)来源的判断

写一个页面test.html,在页面里显示一张图片<img src='xxx.jpg'>

# 这个是分布式文件,修改了之后,不需要重启apache
# 检查rewrite扩展开启没有;没有开启就不报错
<IfModule mod_rewrite.c>
    #开启rewrite
    RewriteEngine On
    # 判断请求的来源,如果不是rewrite.com来的,就请求search.php
    #RewriteCond %{HTTP_REFERER} !rewrite.com [NC]
    #RewriteRule (jpg|png) search.php?$1
</IfModule>

RewriteCond %{HTTP_REFERER} !rewrite.com

判断请求的url是不是有来源,并且是rewrite.com这个的。如果不是就走下面的路由规则

RewriteRule (jpg|png) search.php?$1

判断这个url是不是请求的是jpg或者是Png 。如果是就走search.php。

在配置好分布式文件后,每一次url请求来了,都会走分布式文件,进行判断。

(5)经典功能-防盗链

防盗链:首先你有资源,然后被别人请求了。这个时候,你的服务器流量就被别人使用了。你要做的事情,就是防止别人使用你服务器的资源。这个就是防盗链。

实现一个非常节约的流量的访问,只要是别人引用你的信息,就直接返回403错误。

# 这个是分布式文件,修改了之后,不需要重启apache
# 检查rewrite扩展开启没有;没有开启就不报错
<IfModule mod_rewrite.c>
    #开启rewrite
    RewriteEngine On
    # 返回一个403错误:[F]
    RewriteCond %{HTTP_REFERER} !rewrite.com [NC]
    RewriteRule (jpg|png|gif) -[F]
</IfModule>

做好这种配置后,别人家的网站访问我们网站时,在图片资源方面就会不再显示,但是自己家的访问是没有任何问题。

别人家的网站访问我们网站时,我们也可以给他们返回一个特定的图片

# 这个是分布式文件,修改了之后,不需要重启apache
# 检查rewrite扩展开启没有;没有开启就不报错
<IfModule mod_rewrite.c>
    #开启rewrite
    RewriteEngine On
    # 返回一个403错误:[F]
    RewriteCond %{HTTP_REFERER} !rewrite.com [NC]
    RewriteRule (jpg|png|gif) xxx.jpg
</IfModule>

做好这样的配置,当别人家网站访问我们网站时就会显示出自己设置的特定图片了。

相关文章

  • 网站静态化相关总结

    1、介绍 (1)缓存介绍 1)浏览器缓存: 是保存在浏览器端的缓存,这个缓存我们没有办法控制。在360等卫士的清理...

  • 真静态实现

    真静态实现 静态化: 静态化是解决减轻网站压力,提高网站访问速度的常用方案.包括:纯静态和伪静态。 纯静态: 将P...

  • django页面静态化和缓存小结

    写在前面 基础的学了页面静态化和缓存,这篇文章来总结一下。 页面静态化和页面数据缓存 对网站本身性能的优化,减少数...

  • 听欢哥讲PHP页面静态化

    页面静态化 1、什么是PHP静态化 PHP静态化的简单理解就是使网站生成页面以静态HTML的形式展现在用户面前。 ...

  • 项目代码监控优化 -- 利用infer进行代码质量检测

    facebook infer 代码静态检测 1. infer 相关网站 Infer 中文 | APP 的静态分...

  • 网站相关概念

    网站相关概念 静态网站和动态网站 静态网站 内容固定 容易被检索 没有数据库支持 交互性差 动态网站 可以根据用户...

  • 静态网站 介绍

    什么是静态网站生成器 静态网站生成器是使用一系列配置、模板以及数据,生成静态 HTML 文件及相关资源的工具 由于...

  • 网站静态化方案(一)静态化原理

    网站静态化方案(一)静态化原理 时间:2016-10-26 15:52:04作者:zhongxia原文地址:htt...

  • C#中的静态构造函数和静态初始化器

    网站收藏 C井中的静态构造函数和静态初始化器 C#给类的静态成员初始化必须用静态构造函数 关于Type Initi...

  • 大数据并发处理解决方案:

    1、HTML静态化 效率最高、消耗最小的就是纯静态化的html页面,所以尽可能使网站上的页面采用静态页面来实现,这...

网友评论

      本文标题:网站静态化相关总结

      本文链接:https://www.haomeiwen.com/subject/ygblmftx.html