PHP页面静态化的优缺点与实现
作者:寻找09之夏 发布时间:2023-05-27 09:14:40
前言
随着网站的内容的增多和用户访问量的增多,网站加载会越来越慢,受限于带宽和服务器同一时间的请求次数的限制,,我们往往需要在此时对我们的网站进行代码优化和服务器配置的优化。
一、页面静态化概念
静态化定义
静态化就是指把原本的动态生成的 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() // 冲刷出(送出)输出缓冲区内容缓冲并关闭输出缓冲
来源:https://blog.csdn.net/qq_34272964/article/details/129101680


猜你喜欢
- Python在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和GIL,我觉得错误的教学指导才是主要问题。常见的经典Pyth
- 我要坦白一点。尽管我是一个应用相当广泛的公共域 Python 库的创造者,但在我的模块中引入的单元测试是非常不系统的。实际上,那些测试大部分
- vue配置element-ui遇到的坑注意:本文章参照element-ui官方文档,快速上手部分,的部分教程步骤1.npm安装npm i e
- HTML代码:在一个div容器内,设置3个span<body><div id="i1"> &nb
- 今天拉了一个使用了tornado的项目在本地跑,按照源码作者的步骤配置完,运行,直接报错了,要求环境Python3.6+,我装的是Pytho
- 下策——查询出结果后将时间排序后取第一条select * from a where create_time<="2017-0
- 在 玉伯 的文章 《一道大题目,嘿嘿》 中有这样一段代码:[] == ![]也许很多同学迷惑:咦,这个如何转换呢?首先,我们了解下逻辑 NO
- 本文实例讲述了Python设计模式之代理模式。分享给大家供大家参考,具体如下:代理模式(Proxy Pattern):为其他对象提供一种代理
- 出现invalid syntax报错的几种原因这篇文章旨为刚接触python不久的朋友,提供一点帮助,请在检查代码没有主要问题时再看是否存在
- int 数字类型class int(object): """ int(x=0) -&g
- 普通卷积使用nn.Conv2d(),一般还会接上BN和ReLu参数量NNCin*Cout+Cout(如果有bias,相对来说表示对参数量影响
- osql 工具是一个 Microsoft Windows 32 命令提示符工具,您可以使用它运行 Transact-SQL 语句和脚本文件。
- 本文实例讲述了PHP简单检测网址是否能够正常打开的方法。分享给大家供大家参考,具体如下:这是一个检测网址是否能正常打开的PHP代码,通过下面
- 一、问题由来工作的局域网中,会接入很多设备,机器人上的网络设备就2个了,一个巨哥红外,一个海康可见光。机器人还有自身的ip。有时候机器人挂的
- <script src="jquery.min.js" type="text/javascript&qu
- 我们一般都认为TRUNCATE是一种不可回滚的操作,它会删除表中的所有数据以及重置Identity列。如果你在事务中进行TRUNCATE操作
- 代码使用方法:0001:判断一个计算结果是不是无穷大:if(isFinite(999999999*999999999) == true)--
- 本文实例讲述了python实现的自动发送消息功能。分享给大家供大家参考,具体如下:一个简单的脚本#-*- coding:utf-8 -*-f
- 最近一直在准备用来面试的几个小demo,为了能展现自己,所以都是亲自设计并实现的,其中一个就是在50行代码内来实现一个贪吃蛇,为了说明鄙人自
- 分析摩斯密码是一种将文本信息作为一系列通断的音调、灯光或咔嗒声传输的方法,无需特殊设备,熟记的小伙伴即可直接翻译。它以电报发明者Samuel