php生成静态html页面的方法(2种方法)


Posted in PHP onSeptember 14, 2015

因为每次用户点击动态链接的时候都会对服务器发送数据查询的要求,对于一个访问量可能达百万千万级别的网站来说 这无疑是服务器一个大大的负担,所以把动态数据转换成静态html页面就成了节省人力物力的首选。

因为此前没有相应的经验 刚开始的时候觉得这个技术很神秘,但在看了一些例子以后发现并不是那么复杂(不过网上的资料并不是特别详细),经过一个上午加中下午的试验 终于把该做的任务完成了 下面是一些心得和一个简单的例子

希望大虾们不要笑话我哈

一般来说 用php转换输出html页面有两种办法 引用大虾的文章如下:

第一种:利用模板。

目前PHP的模板可以说是很多了,有功能强大的smarty,还有简单易用的smarttemplate等。它们每一种模板,都有一个获取输出内容的函数。我们生成静态页面的方法,就是利用了这个函数。用这个方法的优点是,代码比较清晰,可读性好。

这里我用smarty做例子,说明如何生成静态页:

<?php
require("smarty/Smarty.class.php");
$t = new Smarty;
$t->assign("title","Hello World!");
$content = $t->fetch("templates/index.htm");
//这里的 fetch() 就是获取输出内容的函数,现在$content变量里面,就是要显示的内容了
$fp = fopen("archives/2005/05/19/0001.html", "w");
fwrite($fp, $content);
fclose($fp);
?>

第二种方法:利用ob系列的函数。

这里用到的函数主要是 ob_start(), ob_end_flush(), ob_get_content(),其中ob_start()是打开浏览器缓冲区的意思,打开缓冲后,所有来自PHP程序的非文件头信息均不会发送,而是 保存在内部缓冲区,直到你使用了ob_end_flush().而这里最重要的一个函数,就是ob_get_contents(),这个函数的作用是获取 缓冲区的内容,相当于上面的那个fetch(),道理一样的。

<?php
ob_start();
echo "Hello World!";
$content = ob_get_contents();//取得php页面输出的全部内容
$fp = fopen("archives/2005/05/19/0001.html", "w");
fwrite($fp, $content);
fclose($fp);
?>

我选用的第2种方法 也就是用ob系列的函数

我刚开始看这个的时候有点不太明白 后来才知道ob是output buffering的意思 也就是输出缓存

当你准备输出的时候 所有的数据都保存在ob里面 服务器解析完php以后 把所有要输出到客户端的html代码都存放在ob里面 如果我们要输出html静态页面 只要把缓存取出来写入一个html页面即可

所以原理其实是很简单的

这里用到了几个函数 由于我初学php 很多函数我还不了解 所以这里也说明一下 希望可以帮助大家

ob_start():开始“捕捉”缓存 也就是从这里开始 打开浏览器的缓存

ob_end_flush():关闭浏览器缓存

ob_get_content():读取缓存内容

fopen(”文件路径”,”打开模式”)打开文件 这个函数的打开模式有好几种 下面介绍几种主要的模式:

“r” 只读方式打开,将文件指针指向文件头。

“r+” 读写方式打开,将文件指针指向文件头。

“w” 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。

“w+” 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。

fwrite(”文件名称”,”写入内容”) 写入文件

fclose() 关闭文件

由于我要转换的html文件非常多 可能有几百个 所以这里不能静态指定fopen的路径 大家可以设置一个路径变量 里面可以保存用户传来的id等信息 方便进行html文件命名 下面是我结合上次php读取xml数据的一个简单例子

<?php
ob_start();//打开浏览器缓存
//下面是读取xml数据
$parser = xml_parser_create(); //创建一个parser编辑器
xml_set_element_handler($parser, "startElement", "endElement");//设立标签触发时的相应函数 这里分别为startElement和endElenment
xml_set_character_data_handler($parser, "characterData");//设立数据读取时的相应函数
$xml_file="1.xml";//指定所要读取的xml文件,可以是url
$filehandler = fopen($xml_file, "r");//打开文件
while ($data = fread($filehandler, 4096)) 
{
xml_parse($parser, $data, feof($filehandler));
}//每次取出4096个字节进行处理
fclose($filehandler);
xml_parser_free($parser);//关闭和释放parser解析器
$name=false;
$position=false;
function startElement($parser_instance, $element_name, $attrs) //起始标签事件的函数
{
global $name,$position;
if($element_name=="NAME")
{
$name=true;
$position=false;
echo "名字:";
}
if($element_name=="POSITION")
{$name=false;
$position=true;
echo "职位:";
}
}
function characterData($parser_instance, $xml_data) //读取数据时的函数
{
global $name,$position;
if($position)
echo $xml_data."<br />";
if($name)
echo $xml_data."<br />";
}
function endElement($parser_instance, $element_name) //结束标签事件的函数
{
global $name,$position;
$name=false;
$position=false;
}
//xml数据读取完毕
$htmlname=$id.".html";//$id可以自己定义 这里代表用户传来的id
$htmlpath="archives/".$htmlname; //设置路径变量
$content = ob_get_contents();//取得php页面输出的全部内容
$fp = fopen($htmlpath, "w");
fwrite($fp, $content);
fclose($fp);
?>

以上内容就是给大家分享的php生成静态html页面的方法(2种方法),希望大家喜欢。

PHP 相关文章推荐
Apache设置虚拟WEB
Oct 09 PHP
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
如何突破PHP程序员的技术瓶颈分析
Jul 17 PHP
PHP面向对象法则
Feb 23 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
PHP中Memcache操作类及用法实例
Dec 12 PHP
纯PHP代码实现支付宝批量付款
Dec 24 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
Mar 23 PHP
PHP receiveMail实现收邮件功能
Apr 25 PHP
在PHP中实现使用Guzzle执行POST和GET请求
Oct 15 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
Jan 23 PHP
PHP概率计算函数汇总
Sep 13 #PHP
整理php防注入和XSS攻击通用过滤
Sep 13 #PHP
教你识别简单的免查杀PHP后门
Sep 13 #PHP
php文件扩展名判断及获取文件扩展名的N种方法
Sep 12 #PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 #PHP
ubuntu下配置nginx+php+mysql详解
Sep 10 #PHP
ThinkPHP函数详解之M方法和R方法
Sep 10 #PHP
You might like
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
PHP date函数常用时间处理方法
2015/05/11 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
PHP实现的文件操作类及文件下载功能示例
2016/12/24 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
js网页右下角提示框实例
2014/10/14 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
vue-amap根据地址回显地图并mark的操作
2020/11/03 Javascript
[01:02:45]完美世界DOTA2联赛 LBZS vs Forest 第三场 11.07
2020/11/09 DOTA
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
使用Python3编写抓取网页和只抓网页图片的脚本
2015/08/20 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
详解Python打包分发工具setuptools
2019/08/05 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
python清空命令行方式
2020/01/13 Python
多个python文件调用logging模块报错误
2020/02/12 Python
医药专业推荐信
2013/11/15 职场文书
文明教师事迹材料
2014/01/16 职场文书
机关财务管理制度
2014/01/17 职场文书
贷款委托书
2014/08/01 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
捐书活动倡议书
2015/04/27 职场文书
2015年度企业工作总结
2015/05/21 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书