PHP页面静态化

2018-07-22 05:46:01来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

buffer    存储数据

buffer 其实就是缓冲区,一个内存地址空间,主要用于存储数据区域。

 

输出流程

内容-->php buffer --> tcp --> 终端

 

在PHP  ini 文件中有一个output_buffering = on

获取缓冲区当中的数据   ob_get_contents();

    echo 1;
    echo '<br/>';
    echo ob_get_contents();

如果在php.ini文件中output_buffering没有开启可以使用 ob_start()

ob_start()  开启缓冲区

 

PHP如何实现页面纯静态化

基本方式:

1、file_put_contents()函数:将一个字符串写入文件  返回写入到文件按内的字节数,失败返回FALSE

2、PHP内置缓存机制实现页面静态化  - output_buffering

 

 

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

1、页面添加缓存时间

2、手动触发方式

3、crontab定时扫描程序

 

 

页面添加缓存时间

用户请求页面---->页面时间是否过期----->是  【动态页面并生成一份新的静态页面】

                  否   【获取静态页面】

is_file('./index.html') && (time()-filemtime('./index.html') < 1200)

如果我们的服务器存在这个文件,并且当前时间减去文件最后修改时间 小于 1200秒  认为缓存没有失效,直接加载静态文件。否则重新生成。

filemtime()获取文件修改时间

 

手动触发方式

在后台开辟一个功能,针对首页做一个  开始更新,点击开始更新,走的程序是没有if判断最初的纯静态页面实现程序

 

crontab定时扫描程序

在Linux下,

crontab -e 编辑crontab

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

第一个*代表分

第二个*代表时

第三个*代表日

第四个*代表月

第五个*代表周

*/5****    */5代表每五分钟

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

告诉Linux服务器每5分钟执行一次这个程序,生成纯静态页面

 

 

**
 * 处理页面静态化业务逻辑
 * 有3种方案, 第一:定时(利用crontab来处理)  第二:人为触发 第三:在页面中控制时间来操作
*/
//header("content-type:text/htm;charset=utf-8");
if(is_file('./index.html') && (time()-filemtime('./index.html') < 1200)) {
    require_once('./index.html');
}else {
    // 引入数据库链接操作
    require_once('./db.php');
    $sql = "select * from news where `category_id` = 1 and `status` = 1 limit 4";
    try{
        $db = Db::getInstance()->connect();
        $result = mysql_query($sql, $db);
        $newsList = array();
        while($row = mysql_fetch_assoc($result)) {
            $newsList[] = $row;
        }
    }catch(Exception $e) {
        // TODO
    }
    ob_start();
    require_once('template/index.php');
    $s = ob_get_contents();
    file_put_contents('./index.html', $s);
    //ob_clean();
}

 

局部动态化

实现步骤:编写接口-->ajax请求接口操作

静态化页面中如果想加载动态的内容如何处理?

ajax技术

jquery中ajax请求方式

$.ajax({
    url: '',  //请求服务器端的接口地址
    type: 'get',
    dataType: 'json',
    error: function(){
    },
    success: function(result){
    }
})

 

 

伪静态

分析:通过正则表达式去分析伪静态URL地址

例:http://static.com/newsList.php?type=2&category_id=1 =>  http://static.com/newsList.php/2/1.html

其中: 2-->type=2,  1-->category_id=1

$_SERVER:服务器当中的server变量  print_r($_SERVER)

其中[PATH_INFO]的值 => /2/1.html

 

preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。

语法:

int preg_match( string pattern, string subject [, array matches ] )
pattern 正则表达式
subject 需要匹配检索的对象
matches 可选,存储匹配结果的数组, $matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推
preg_match("/^\/(\d+)\/(\d+)(\.html)$/", $_SERVER['PATH_INFO'], $pathInfo)

\d 匹配0-9当中的一个数字    \d+  匹配一个或者多个     $pathInfo赋给这个变量

接着进行匹配

if(preg_match("/^\/(\d+)\/(\d+)(\.html)$/", $_SERVER['PATH_INFO'], $pathInfo)) {
  //var_dump($pathInfo);
  $type = $pathInfo[1]; // 类型值
  $categoryId = $pathInfo[2]; // 所在栏目值
  // 引入数据库链接类
  require_once('./db.php'); 
  $sql = "select * from news where `category_id` = ".$categoryId." and `type` = ".$type." order by id desc";
  //  提取数据之后组装好放入模板中
  //...
} else { // TODO }

其中$_SERVER['PATH_INFO']

 

/**
* 利用PHP正则表达式来处理伪静态
* 以http://static.com/newsList.php?type=2&category_id=1 =>  http://static.com/newsList.php/2/1.shtml
*/
//echo 12;
var_dump($_SERVER);

if(isset($_SERVER['PATH_INFO'])) {
    // 解析 /2/1.shtml 匹配pathinfo值,如果没匹配到则数据不合法,若匹配到做相应处理
    if(preg_match("/^\/(\d+)\/(\d+)(\.shtml)$/", $_SERVER['PATH_INFO'], $pathInfo)) {
        //var_dump($pathInfo);
        $type = $pathInfo[1]; // 类型值
        $categoryId = $pathInfo[2]; // 所在栏目值
        // 引入数据库链接类
        require_once('./db.php'); 
        $sql = "select * from news where `category_id` = ".$categoryId." and `type` = ".$type." order by id desc";
        try{
            $db = Db::getInstance()->connect();
            $result = mysql_query($sql, $db);
            $newsList = array();
            while($row = mysql_fetch_assoc($result)) {
                $newsList[] = $row;
            }
            var_dump($newsList);
            exit;
        }catch(Exception $e) {
            // TODO
        }
    } else {
        // TODO
        die('url error!');
    }
} else {
    // TODO
    // 错误提示,然后跳转到首页处理
    die('地址有误');
}

 

WEB服务器rewrite配置  达到伪静态的目的

apache下rewrite配置

1、虚拟域名配置

2、httpd_vhosts.conf配置文件配置相关信息

虚拟域名配置:

C:\work\wamp64\bin\apache\apache2.4.17\conf   下  httpd.conf

1、httpd.conf文件中开启相关模式

      LoadModule rewrite_module modules/mod_rewrite.so

      Include conf/extra/httpd-vhosts.conf

      vhosts文件增加相关域名   (ServerName)

C:\work\wamp64\bin\apache\apache2.4.17\conf\extra   --->    httpd-vhosts.conf   --->ServerName

2、httpd_vhosts.conf配置文件配置相关信息(虚拟域名的配置文件)

DocumentRoot:  项目目录

ServerName:虚拟域名

 继续配置hosts文件:C:\Windows\System32\drivers\etc\  hosts

 

伪静态配置案例:

httpd-vhosts.conf  下配置

  RewriteEngine on    //开启

  RewriteRule^/detail/([0-9]*).html$ /detail.php?id=$1     //规则

  $1 是 ([0-9]*)

  例:state.com/detail/134.html    ==    state.com/detail.php?id=134

 #RewriteCond  两句话的意思  执行纯静态化内容

  -d 代表目录

  -f 代表文件

  意思:当我们服务器存在这个目录或者存在这个文件,这时候就让他去访问这个目录或者文件。。没有就会访问动态内容。

 

 

nginx下rewrite配置

   rewrite ^/detail/(\d+)\.html$ /detail.php?id=$1 last;

   rewrite     匹配规则       对应到的动态文件

虚拟机或者服务器下   /etc/nginx/conf.d文件下

static.singwa.com.conf文件

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:webform 简单的服务器控件。

下一篇:ClientDataSet应用