一、静态化
1、示例代码
- php代码执行=》缓冲区=》抓取缓冲区=》生成静态页面
- 流程:
1、开启缓冲区
2、抓取php缓冲区的内容:即在浏览器看到的静态内容都会被缓冲区收集
3、利用抓取到的内容制作静态页面
4、关闭并刷新清除缓冲区
<?php
//1.开启缓冲区
ob_start();
for ($i=0; $i < 100; $i++) {
echo $i;
echo '<hr>';
}
//2.抓取php缓冲区的内容
$cont = ob_get_contents();
//3.利用抓取到的内容制作静态页面
file_put_contents('./1.html', $cont);
//4.删除缓冲区的内容并关闭缓冲区
ob_end_clean();
ob_end_flush();
2、相关函数
他人资料:PHP缓冲区原理的初步学习
- (1)开启缓冲:
ob_start():打开输出控制缓冲 - (2)获取内容:
ob_get_contents():返回输出缓冲区的内容
ob_get_clean():得到当前缓冲区的内容并删除当前输出缓冲区
ob_get_flush():刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区 - (3)清空:
ob_clean():清空(擦掉)输出缓冲区
ob_end_clean():清空(擦除)缓冲区并关闭输出缓冲
ob_get_clean():同上 - (4)刷新:
ob_flush():冲刷出(送出)输出缓冲区中的内容
ob_end_flush():冲刷出(送出)输出缓冲区内容并关闭缓冲
ob_get_flush():同上 - (5)关闭:
ob_end_clean():同上
ob_end_flush():同上 - flush、end、clean的区别:三个方式相互搭配
(1)clean:直接清空缓冲区,但是不会关闭缓冲区,也不会输出任何东西
(2)flush:清空缓冲区,但是不会关闭缓冲区,会输出缓冲区的所有内容在浏览器,ob_get_flush == ob_get_contents 和 ob_flush
(3)end:直接关闭缓冲区
二、伪静态
1、Apache
- 确认Apache已经正确加载了mod_rewrite模块
- 在虚拟主机配置中加 AllowOverride All
- 在网站根目录下创建一个伪静态规则文件“.htacess”
- 在.htacess文件中进行编辑
(1)开启重写开关:RewriteEngine On
(2)编写重写规则:RewriteRule ^order.xml$ order.php 当访问order.xml时,实际上访问的是order.php
可带参数:$1表示重复使用第一个括号的内容
RewriteRule ^cat_(\d+).html$ cat.php?id=$1
RewriteRule ^cat_(\d+)([a-z]+)([a-z]+).html$ cat.php?id=$1&name=$2&addr=$3
(3)定义重写条件:RewriteCond,如果条件成立,将会执行接下来的RewriteRule的重写规则
例:如果访问的主机域名地址是通过web.yyfs.com开始的
RewriteCond %{HTTP_HOST} ^web.yyfs.com
则需要跳到we.php.com域名下进行访问
RewriteRule ^(.*) http://web.php.com/$1
此时(.*)代表web.yyfs.com访问的时候除了主机名之外的信息
(4)隐藏index.php入口文件:
RewriteCond %{REQUEST_FILENAME} !-f #访问的不是一个文件
RewriteCond %{REQUEST_FILENAME} !-d #访问的不是一个目录
RewriteRule ^(.*) index.php/$1 - httpd-vhosts.conf文件
<VirtualHost *:80>
ServerName www.car.com
DocumentRoot "F:/amp/daima/car/Car/public"
<Directory "F:/amp/daima/car/Car/public">
Options Indexes FollowSymLinks
Order Allow,Deny
Allow From all
DirectoryIndex index.php index.html
AllowOverride all
</Directory>
</VirtualHost>
- Laravel框架中的.htacess文件:RewriteCond与RewriteRule用法
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On #开启重写开关
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
2、Nginx
- Nginx的伪静态相较于Apache来说配置简单得多
- 使用rewrite或者try_files(推荐):因为rewrite会把所有请求过来的url地址,都进行正则匹配后进行中邪,静态的url也进行了一次匹配,例如http://xxxx.com/yyfs.png这个地址本来是不需要重写的,但是rewrite还是会进行一次匹配,浪费服务器资源,影响执行效率。Nginx一般都是配合fpm来使用的,我们真正需要匹配的,是一些动态的url地址。
server {
listen 80 default_server;
server_name _;
location / {
root /usr/www/html/car;
index index.html index.htm;
#rewrite ^/(.*)$ /index.php/$1;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}