PHP静态化与伪静态

一、静态化

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>
<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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值