• PHP 页面静态化/纯静态化/伪静态化


    个人博客迁移至独立博客:https://blog.plcent.com/,欢迎大家访问

    概念

    PHP静态化分为:纯静态化 和 伪静态化;纯静态化又分为:局部静态化 和 完全静态化

    纯静态化:是把PHP生成的动态页面保存成静态的html文件,用户访问该静态页面,而不是用户每一次访问都重新生成一张相同的网页,优点就是减小服务器开销,

      局部静态化:是生成的静态文件中,有局部的数据还是通过ajax技术动态获取的;

      完全静态化:即不存在动态获取数据的情况,所以内容都来自静态的html页面

    伪静态化:其实还是动态访问,其实质是动态生成数据,你访问的网址类似于"http://yourhost,com/index/post/12",是一个静态地址,该地址多见于博客地址,但伪静态化中,你访问的网址实际上经过服务器解析,还是会解析成类似于"http://yourhost,com/?c=index&a=post&id=12"的地址,所以称之为伪静态化

      伪静态的优点:美观;便于搜索引擎收录

    纯静态化的实现

    利用php内置的ob函数实现页面的静态化,大概步骤如下:

    <?php ob_start();//开启缓存 
    ?>
    <p>我是要生成的静态内容,也可以在该处链接数据库生成动态内容于此</p>
    <?php 
    file_put_contents( 'index.html', ob_get_clean() );//把生成的静态内容保存到index.html文件,而不是输出到浏览器
    ?>
     

    触发系统生成纯静态化页面

      方法:页面添加缓存时间;手动触发

    页面添加缓存时间

    <?php
    $file_name = 'index.html';
    if(file_exists( $file_name ) &&  filemtime( $file_name ) - time() < 10 ){//如果文件是存在并且最后修改时间小于设定时间 10s
        //filemtime( $file_name );//得到文件最后修改时间
        //time();//当前时间
        require_once( $file_name );//引入文件
    }else{
     ob_start( );
     ?>
    <p>我是要生成的静态内容</p>
     <?php
    file_put_contents( $file_name,  ob_get_contents() )//输出到浏览器
    }

      如果后台数据存在更细,定时刷新不能及时更改静态页面,怎么办?所有引入了手动触发的功能

    手动触发

      手动触发的大概样式就类似于优酷视频评论区,当有新评论时,会后一条屎黄屎黄的小提示框:“有新评论,点击更新”,也类似于app中的下滑刷新的机制,自己去寻找吧。。

    除此之外还有Linux下的crontab定时扫描程序

    */5****php/data/static/index.php

    局部静态化内容不做叙述

    PHP伪静态

    // 静态:http://yourhost.com/index.php/12/2.html
    // 动态:http://yourhost.com/index.php?type=12&id=2
    $pathinfo = $_SERVER['PATH_INFO'];
    if( preg_match('/^/(d+)/(d+)/', $pathinfo,$path) ){
        $type = $path[1];
        $id = $path[2];
        echo 'type=',$type,'&id=',$id;//获得type 和 id 进一步处理
    }else{
        //错误处理
        echo "err";
    }

    Apache服务器rewrite配置

    在httpd.conf文件中,找到

    #注释:去掉前边的" # "开启rewrite服务,重启服务器生效
    #LoadModule rewrite_module modules/mod_rewrite.so

    #注释:http-vhosts.conf文件是虚拟域名配置的文件,开启改文件可以配置虚拟域名,一般默认是开启的
    #Include conf/extra/httpd-vhosts.conf

    如果你不会配置虚拟域名,可以参考我的另外一篇文章:WAMPServer配置修改及问题汇总

    rewrite伪静态配置

    <VirtualHost *:80>
        ServerAdmin webmaster@dummy-host.example.com
        DocumentRoot "c:/Apache24/docs/dummy-host.example.com"
        ServerName dummy-host.example.com
        ServerAlias www.dummy-host.example.com
        ErrorLog "logs/dummy-host.example.com-error.log"
        CustomLog "logs/dummy-host.example.com-access.log" common
    
    
        #配置规则如下所示
        RewriteEngine on
        RewriteRule ^/vidio/([0-9]*).html$ /vidio.php?id=$1
        
    </VirtualHost>

    RewriteEngine其他配置规则以后会再添加

    现在你访问http://yourhost.com/vidio/12.html时,相当于访问了http://yourhost.com/vidio.php?id=12

     问题:配置完上面的内容后,又存在以下问题?如果项目目录下存在该静态页面时,到底是访问我们的静态页面还是访问我们伪静态的文件呢?

        经过测试我们发现,并不会访问静态页面,如果我们想访问我们的静态页面怎么办?

    伪静态和静态页面冲突时解决办法:

        #完整的配置规则如下
        RewriteEngine on
        #添加以下两项,!-d  和  !-f  分别表示  目录 和 文件
        #当访问的伪静态和相应的静态目录和文件冲突时,访问静态页面
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
        RewriteRule ^/index/([0-9]*).html$ /index.php?id=$1
  • 相关阅读:
    51nod 1412 AVL树的种类
    bzoj1093 [ZJOI2007]最大半联通子图 缩点 + 拓扑序
    bzoj1116 [POI2008]CLO 边双联通分量
    luoguP4366 [Code+#4]最短路 最短路
    51nod1821 最优集合 贪心
    51nod2000 四边形分割平面 规律题
    luoguP3250 [HNOI2016]网络 树链剖分 + 堆
    [Luogu5162]WD与积木(多项式求逆)
    [Luogu5161]WD与数列(后缀数组/后缀自动机+线段树合并)
    [Luogu5106]dkw的lcm
  • 原文地址:https://www.cnblogs.com/caoruiy/p/4698938.html
Copyright © 2020-2023  润新知