前言
随着网站的内容的增多和用户访问量的增多,网站加载会越来越慢,受限于带宽和服务器同一时间的请求次数的限制,我们往往需要在此时对我们的网站进行代码优化和服务器配置的优化。
一、页面静态化概念
静态化定义
静态化就是指把原本的动态生成的 html 页面变成静态内容保存起来,当用户客户端请求的时候,直接返回静态页面,不用再经过服务渲染,不用查询数据库,可以大大减少服务器和数据库压力,显著提升网站性能。
静态页面
静态页面,即静态网页,是实际存在的,无需经过服务器的编译,直接加载到客户浏览器上显示出来。静态页面需要占一定的服务器空间,且不能自主管理发布更新的页面,如果想更新网页内容,要通过FTP软件把文件DOWN下来用网页制作软件修改(通过fso等技术例外)。常见的静态页面举例:.html扩展名的、.htm扩展名的。
动态页面
动态页面是通过执行asp,php,jsp,.net等程序生成客户端网页代码的网页。 动态页面通常可以通过网站后台管理系统对网站的内容进行更新管理。发布新闻,发布公司产品,交流互动,博客,网上调查等,这都是动态网站的一些功能。也是我们常见的。 动态页面常见的扩展名有:.asp .php .jsp .cgi.aspx 等。 注意:动态页面的“动态”是网站与客户端用户互动的意思,而非网页上有动画的就是动态页面。
静态化分类
从形式看:纯静态和伪静态
从范围看:整体静态化和局部静态
静态化优点和缺点
优点:
适合 SEO,有利于搜索引擎收录
提升网站速度和稳定性
网站更加安全,HTML 页面避免 PHP 相关漏洞
缺点:
生成静态页面多,占用更多的存储空间
增加网站开发成本和维护成本
二、静态化实现
认识 PHP Buffer
在php中,buffer其实就是缓冲区,一个内存地址空间,主要用于存储数据;默认是开启状态,大小默认4096,在php.ini文件中由output_buffering配置,只有当缓冲区满了或者 php 运行完毕,才将数据输出去。
php.ini 代码示例:
output_buffering = on
#打开output缓冲,默认打开的。
缓冲流程:
# 详细了解输出过程,大家可以自行查阅
1.打开了 php 输出缓存: echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display
2.未打开 php 输出缓存: echo,print -> server buffering -> browser buffering -> browser display
原生PHP输出(创建 index.php 文件,本地配置虚拟域名"www.test.vip")。
代码如下(示例):
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<title>网页静态化</title>
</head>
<body>
<h1>排名</h1>
<ul>
<?php for ($i = 1; $i <= 5; $i++) { ?>
<li>No.<?php echo $i; ?></li>
<?php } ?>
</ul>
<?php ?>
</body>
</html>
请求如下(www.test.vip/index.php):
使用PHP文件读写功能生成静态页面
代码如下(示例):
<?php
$data = '<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<title>网页静态化</title>
</head>
<body>
<h1>排名</h1>
<ul>
<li>No.1</li>
<li>No.2</li>
<li>No.3</li>
<li>No.4</li>
<li>No.5</li>
</ul>
</body>
</html>';
$fp = fopen("index.html", "w");
if (!$fp) {
echo "System Error";
exit();
}
fwrite($fp, $data);
fclose($fp);
echo "生成 index.html 成功!";
其中"$data"数据是解析好的前端代码,若包含 PHP 原生代码是无法解析的,那如何把动态的 PHP 语言静态化?
PHP OB 缓存机制生成静态页面
代码如下(示例):
<?php
ob_start();
require_once('index.php'); // 引入模版文件
$data = ob_get_contents();
file_put_contents('index.html', $data); // 生成静态文件 index.html
ob_end_clean(); // 输出信息并清除缓存
$fp = fopen("index.html", "w");
if (!$fp) {
echo "System Error";
exit();
}
fwrite($fp, $data);
fclose($fp);
echo "生成 index.html 成功!";
涉及函数介绍
ob_start() // 打开输出控制缓冲,若 php.ini 已经开启,那么这里会开启一个新的输出缓冲区;
ob_get_length() // 返回输出缓冲区的长度
ob_get_level() // 返回输出缓冲区的嵌套级别
ob_get_status() // 返回输出缓冲区的状态(数组形式返回,默认返回最顶层,参数为true时返回所有)
ob_get_contents() // 返回输出缓冲区的内容
ob_get_clean() // 以字符串格式返回当前输出缓冲区并关闭输出缓冲,等价于ob_get_contents和ob_end_clean);
ob_end_clean() // 清空(擦除)缓冲区并关闭输出缓冲
ob_get_flush() // 以字符串返回输出缓冲区内容并关闭缓冲
ob_end_flush() // 冲刷出(送出)输出缓冲区内容缓冲并关闭输出缓冲
三、伪静态实现
伪静态介绍
伪静态就是通过某些技术(如rewrite)把动态网页的URL地址伪装成静态网页URL地址,但实质上用户访问的还是动态网页,只不过URL地址看起来是符合静态网页地址特征,因此,用户及某些搜索引擎会误认为其是静态网页。
伪静态实现
下面我们对"http://www.test.vip/web/article?id=1"地址分别在Nginx和Apache上做伪静态处理。
Nginx 伪静态
(1)在nginx.conf 合适位置加入 rewrite 语句,代码如下:
rewrite ^/web/article/(\d).html$ /web/article.php?id=$1 last;
rewrite语法
指令语法:rewrite regex replacement [flag]
regex :表示正则匹配规则。
replacement :表示跳转后的内容。
flag :表示 rewrite 支持的 flag 标记。
应用位置:server、location、if
regex
常用正则表达式:
字符 描述
\ 将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
? 匹配前面的字符零次或一次
. 匹配除“\n”之外的所有单个字符
(pattern) 匹配括号内的pattern
flag
标记符号 说明
last 本条规则匹配完成后继续向下匹配新的location URL 规则
break 本条规则匹配完成后终止,不在匹配任何规则
redirect 返回302临时重定向
parmanent 返回301永久重定向
Apache 伪静态
(1)在Apache配置文件httpd.conf 中启用Rewrite,去除前面的"#",使apache支持 mod_rewrite 模块,代码如下:
LoadModule rewrite_module modules/mod_rewrite.so
(2)在服务器找到配置文件vhosts.conf,启用 .htaccess,打开虚拟机配置文件vhosts.conf,找到其中的"AllowOverride"项,将它的值修改为All。
(3)完成修改后保存,并重新启动Apache服务器,使修改生效。
(4)接下来在项目的根目录下创建一个.htaccess 文件,实现对PHP文件后缀的隐藏操作。.htaccess文件的格式如下:
< IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine on
RewriteRule index.html index.php
RewriteRule ^/article/(\d+).html$ /web/article.php?id=$1
# 更多伪静态规则
< /IfModule>