PHP实现页面静态化的超简单方法


Posted in PHP onSeptember 06, 2016

为什么要页面静态化?

1.动态文件执行过程:语法分析-编译-运行

2.静态文件,不需要编译,减少了服务器脚本运行的时间,降低了服务器的响应时间,直接运行,响应速度快;如果页面中一些内容不经常改动,动态页面静态化是非常有效的加速方法。(纯静态,伪静态还是需要PHP解释器的)

3、生成静态URL利于SEO,利于蜘蛛抓取和收录,有利于提升排名

优化页面响应时间方法

1.动态页面静态化

2.优化数据库

3.负载均衡

4.使用缓存等等

//动态页面静态化一般用于不经常改动的地方,频繁改动的地方一般不适用静态化,可用伪静态(例如微博等)

静态化详细介绍

1、纯静态分为局部静态化(局部动态化,使用AJAX动态获取数据)和纯静态化。

伪静态:改变URL(需要服务器支持,如:apache等等)

2、从URL结构以及页面名称看,伪静态和静态页面是一样的。伪静态的页面后缀可以是html htm 或者是目录格式

伪静态只是改变了URL的表现形式,实际上还是动态页面

静态页面可以节省服务器资源,而伪静态严格说是增加服务器资源消耗的

总结,在SEO方面,伪静态和静态页面的功能是相同的,但是伪静态本质上还是动态页面,所以消耗资源是和动态页面一样的,而且因为Rewrite服务器还需要消耗额外的资源。

Buffer缓冲区认知

PHP实现页面静态化的超简单方法

1、开启buffer

•在php.ini中的output_buffering开启
•在php文件中使用ob_start()函数开启

; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096

2、获取缓冲区的内容

output_buffering=on 需要先开起,才能调用ob_get_contents()函数。但是,如果不开启output_buffering时,当在头文件中调用函数ob_start()函数时,ob_get_contents()也能使用。

ob_get_content();//返回输出缓冲区的内容;

PHP如何实现页面纯静态化

基本方式

1、file_put_contents

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

ob_start()//如果php.ini已经开启,那么这里会开启一个新的输出缓冲区;
ob_get_contents()//获取输出缓冲区内容;
ob_clean()//清空输出缓冲区内容,但是不会删除输出缓冲区
ob_get_clean//获取输出缓冲区内容并且删除输出缓冲区,等价于ob_get_contents和ob_end_clean)

下方这段代码,运行是不会有输出的

原因就是输出缓冲区被清空了,看上图理解

ob_start();
echo 777;
echo 000;
ob_clean();
echo ob_get_contents();

纯静态实现,代码和实现逻辑参考:

<?php
/**
 * 触发系统生成纯静态化页面业务逻辑
 * 有3种方案: 
 * 第一:定时扫描程序(利用crontab来处理) 
 * 第二:手动触发方式,人为触发
 * 第三:页面添加缓存时间,在页面中控制时间来操作
*/
//===========================================
//生成纯静态文件步骤
//1、连接数据库,然后从数据库里面获取数据
//2、把获取到的数据填充到模版文件里面
//3、需要把动态的页面转为静态页面,生成静态化文件
//============================================
//PHP实现页面静态化有以下步骤:
//1:A.php请求数据库数据:通过mysql或者mysqli或者PDO扩展
//2:在A.html中输出A.php请求的数据库数据:一般是将将在数据库中取出的数组形式的数据赋予新的数组,并且输出
//3:在A.php中包含A.html文件:直接通过require_once()函数或者inclde_once()
//4:开启数据缓存ob_start()=>获取获取缓存内容并且将数据生成在静态文件中file_put_contents('index.shtml',ob_get_clean());
//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');//引入模版文件
  file_put_contents('./index.html', ob_get_contents());//生成静态文件
  //ob_clean();
}

静态页面中局部动态化实现

利用Jquery中的ajax请求文件,获取到返回的JSON数据,然后应用到模版就可以了

伪静态

Nginx服务器默认不支持PATH INFO模式,需要额外配置

Apache伪静态设置

PHP实现页面静态化的超简单方法

1、开启apache mod_rewrite.so 配置 在 httpd.conf中。

测试的话可以用phpinfo查看,看是否loaded modules 有这个模块

2、inculde conf/extra/httpd-vhosts.conf virtual hosts支持,虚拟域名配置

3、编辑vartual host 文件

4、本机host文件加入配置的域名(如果需要本机测试针对windows)

5、伪静态配置

- 5.1 rewrite engine on
- 5.2编写规则

^/post/([0-9]*).html$ /post.php?id=$1

放在 virtualhost 段中

post.php 中编写

<?php 
echo 'this is '.$_GET['id'];

然后可以访问a.com/123.html 返回的就是this is 123.

扩展:如果目录下有123.html这个真正的文件,那么还是加载了动态的post 123.
那么如何设置呢,想要当前文件有了真正的静态文件,那么需要以下配置了

RewriteEngine on
RewriteRule ^/post/([0-9]*).html$ /post.php?id=$1
#存在目录
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}!-d
#存在文件
RewriteCond%{DOCUMENT_ROOT}%{REQUEST_FILENAME}}!-f

以上两句话意思是如果根目录下有请求的目录或者文件,那就用他

当然这个要放在刚刚的那个rewrite的上面。

Nginx伪静态

PHP实现页面静态化的超简单方法

伪静态是影响服务器性能的,不是越多越好,需要按需求而定

以上这篇PHP实现页面静态化的超简单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
如何在PHP程序中防止盗链
Apr 09 PHP
php xml文件操作代码(一)
Mar 20 PHP
PHP parse_url 一个好用的函数
Oct 03 PHP
php继承的一个应用
Sep 06 PHP
浅析php header 跳转
Jun 17 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
详解PHP中的PDO类
Jul 06 PHP
Yii遍历行下每列数据的方法
Oct 17 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
Mar 21 PHP
laravel框架上传图片实现实时预览功能
Oct 14 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 PHP
php字符串函数 str类常见用法示例
May 15 PHP
基于PHP实现短信验证码接口(容联运通讯)
Sep 06 #PHP
PHP7 新特性详细介绍
Sep 06 #PHP
PHP会员找回密码功能的简单实现
Sep 05 #PHP
浅谈php中urlencode与rawurlencode的区别
Sep 05 #PHP
浅谈mysql_query()函数的返回值问题
Sep 05 #PHP
PHP针对多用户实现更换头像功能
Sep 04 #PHP
PHP加密技术的简单实现
Sep 04 #PHP
You might like
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
PHP简单实现遍历目录下特定文件的方法小结
2017/05/22 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
jquery里的正则表达式说明
2011/08/03 Javascript
jQuery图片轮播的具体实现
2013/09/11 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
你可能不知道的JSON.stringify()详解
2017/08/17 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
详解create-react-app 自定义 eslint 配置
2018/06/07 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
js实现类似iphone的网页滑屏解锁功能示例【附源码下载】
2019/06/10 Javascript
python编写暴力破解FTP密码小工具
2014/11/19 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
python 实现二维列表转置
2019/12/02 Python
简单了解python元组tuple相关原理
2019/12/02 Python
python 实现二维字典的键值合并等函数
2019/12/06 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
Python新手学习raise用法
2020/06/03 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
html5时钟实现代码
2010/10/22 HTML / CSS
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
医院学雷锋活动策划方案
2014/02/15 职场文书
写给老婆的检讨书
2014/02/21 职场文书
2014年母亲节寄语
2014/05/07 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL
CentOS MySql8 远程连接实战
2022/04/19 MySQL