一、页面静态化
1、页面静态化介绍
说明:
页面静态化,就是将PHP查询的结果保存到一个静态的html文件中,将来用户访问的时候,直接访问该静态html文件即可
相对于页面缓存的比较:
缓存减轻了数据库的压力,但是服务器(php)压力依然存在
页面静态化之后:减轻了服务器、数据库的压力
使用页面静态化:
查询比较频繁、不经常更新的内容,可以使用页面静态化,例如:新闻、文章
但是数据经常变化的:评论、天气情况、股票等,就不适合使用页面静态化
页面静态化使用什么技术实现呢?
就使用ob缓冲、结合file_put_contents函数实现
2、ob缓冲介绍
ob缓冲是服务器向客户端响应数据时,存储响应数据的临时空间,
服务器在向客户端推送数据之前,不是一次性把所有的数据都给客户端,而是先push到ob缓冲区域,再一点一点给客户端,减轻服务器的压力。
开启ob缓冲
在php.ini配置文件中,找到output buferring
ob缓冲相关函数
ob_start() 开辟一块新的缓冲区域
只要ob_start()一次,就会在PHP的缓存中开辟一块缓冲区域
而且,服务器输出的内容会先输出到缓冲区域,再给客户端响应
ob_get_contents() 获取缓冲区域里面的内容
ob_get_length() 获取缓冲区域内容的长度
ob_flush() 将缓冲区域的内容直接刷出\输出
ob_get_flush() 获得缓冲区域刷出的内容
ob_clean():清空缓冲区域的内容
ob_get_clean():获得清空的缓冲区域的内容
ob缓冲处理器
说明:
ob缓冲处理器,就是在输出缓冲区域的内容之前,使用某个函数进行处理
通常我们会使用ob_gzhandler处理器进行压缩处理
ob多缓冲
说明:
我们可以在PHP里面开启多块缓冲区域,每ob_start()一次,就会在PHP里面创建一块缓冲区域,而且,将来ob_clean清空缓冲区域时,操作的是离开启缓冲最近那个缓冲区域
2、ob缓冲实现页面静态化
说明:
服务器响应给客户端的数据,会先输出到缓冲区域
服务器向客户端响应数据的方式:echo、var_dump、require、include
两步生产静态html
(1)先将require_once加载的模板内容,保存到缓冲区域,再读取并输出到静态html文件
(2)使用file_put_contents函数生成html文件
注意:使用smarty是可通过fetch方法获取$content (smarty封装了ob缓冲)
$content = $smarry->fetch('xxx.html')
二、伪静态
1、伪静态介绍
说明:
页面静态化是真静态,因为生产静态的html文件,所谓的伪静态是假的静态,伪静态的效果是这个样子:http://localhost/app/xxxcontroller/add
访问的时候,会进入控制器的add方法中,但是给用户的感觉是静态页面,实际上还是会动态解析即 index.php?c=xxxcontroller&a=addAction
,所以称之为伪静态。
伪静态的优点
(1) url地址简洁,方便用户记忆
(2) 对SEO(搜索引擎优化)(注:搜索引擎包括:百度、360搜索、搜狗、谷歌),比较友好
index.php?m=home&c=question&a=indexAction,会根据参数的不同进入到不同的页面(日历:y=2019&m=12&d=22),担心页面没有穷尽,当然现在搜索引擎技术不断进步(对动态网站内容专区也会越来越好)
使用伪静态的地址:question/index.html,看到网页的时候,认为你是静态的网页,多抓取。因此便于搜索引擎收录。
2、伪静态实现
(1) 借助PHP超全局数组变量:$_SERVER[‘PATH_INFO’]获得路径的信息,如果index.php后面有路径信息则返回,如果index.php后面没有路径信息,则提示未定义
(2)根据index.php后面的路径的信息,解析出对应的$_GET[‘m’]、$_GET[‘c’]、$_GET[‘a’]
伪静态地址基本类型:
情况1:admin
解析到后台,进入到默认的控制器、默认方法中
情况2:admin/question
解析到后台模块的question控制器,默认的动作
情况3:admin/question/add
解析到后台、question控制器的add方法
情况4:admin/question/delete/id/2
解析到后台、question控制器、delete方法,额外参数是id=2
解析规则:
先把.html、.htm 这样的字符替换掉
字符串分割:explode()炸开,获得数组
根据炸开之后的数组的元素个数进行分类。
3、隐藏入口文件
说明:
有的网站不想让用户看到网站采用什么语言开发、其次想让url地址更加简洁,所以通常直接访问网站,不需要携带index.php。
实现:
(1)直接通过修改apache的配置文件实现,当访问的url地址指向的不是一个文件、不是一个目录的时候,将该url地址信息作为index.php后面的PATH_INFO进行处理。
(2)apache提供了一个分布式配置文件(.htaccess),分布式配置文件,只针对当前项目有效,对其他项目没有影响,而且不用重启apache服务器。
步骤:
步骤1:首先要在apache的配置文件中,开启重写模式(也就是允许使用分布式配置系统)
步骤2:在项目根目录创建.htaccess文件
<IfModule rewrite_module> #开启重写引擎 RewriteEngine on #重写的条件(访问的url地址指向的不是文件、不是目录的时候,采用重写机制) RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f #重写规则 RewriteRule (.*) index.php/$1 </IfModule> #当访问的是一个目录时,会将如下文件作为默认的欢迎页面,会先显示index.html,如果没有则显示index.php <IfModule dir_module> DirectoryIndex index.html index.php </IfModule>