php读取模板生成静态功能,php 生成静态页面的办法与实现代码详细版

php中主要用到的就是要用到fread()和fwirte()。而静态页面生成了之后,就会牵扯到修改的问题。这里可以用到正则匹配的方法来替换模版中改变的部位。不过此种方法太麻烦,值得推荐的方法是直接把原来生成的模版砍掉,重新生成,呵呵,真正的一了百了。

还需要说明的一点就是,这种生成静态页面的方法一般都用于那些变化不是很频繁的页面,比如信息的最终页面。而针对列表页,如果信息更新不是很频繁的话,也是可取的。现在网上流行好多可以生成静态页面的blog或者论坛程序,都是通过手动点击后台“生成html页”的按钮来“半自动”生成html的。而对一些信息量非常大的门户网站,则行不通。因为静态页之所以叫“静态”,是因为其不可自动改变。如果信息列表每天更新100次,那么静态的列表页就要重新生成100次。如果我有10个这样的栏目,那想想也够吐血的了。

好了,闲话少说,现在来看看实际的程序演示:

first:是一个利用ob函数来实现的,代码比较简单,效率相对也高一些。

ob_start();

@readfile("http://tools.jb51.net/");

$text = ob_get_flush();

$myfile = fopen("myfile.html","w");

$text =

str_replace ("{counent}",$string,$text);

fwrite($myfile,$text);

ob_clean();

?>

因为就算要生成静态页面,动态读取那部分也是要保留的,把数据插入数据库后,把url传递给readfile函数,然后读入缓存,fwrite一下就可以生成静态页面,这个是驼驼最欣赏的一种作法。代码行数最少,效率最高。http://tools.jb51.net/是一个裸页,也就是单纯的内容,没有头,尾,菜单。这样才能比较自由的定制自己的模版myfile.html。如果仅仅是要求生成静态页的话,这样基本上就满足需求了。

second:普通生成静态html页。

这种作法就是按部就班的来做,fread进来页面,然后str_replace替换

首先是创建最终内容页:

PHP代码

$title = "http://siyizhu.com测试模板";

$file = "TwoMax Inter test templet,
author:[email=Matrix@Two_Max]Matrix@Two_Max[/email]";

$fp = fopen ("temp.html","r");

$content = fread($fp,filesize ("temp.html"));

$content = str_replace("{file}",$file,$content);

$content = str_replace("{title}",$title,$content);

$filename = "test/test.html";

$handle = fopen ($filename,"w"); //打开文件指针,创建文件

/*  检查文件是否被创建且可写 */

if (!is_writable ($filename))

{

die ("文件:".$filename."不可写,请检查其属性后重试!");

}

if (!fwrite ($handle,$content))

{ //将信息写入文件

die ("生成文件".$filename."失败!");

}

fclose ($handle); //关闭指针

die ("创建文件".$filename."成功!");

?>

这一步比较简单。只是单纯的变量替换即可。如果要生成静态的列表页面的话,原理也是一样,用程序来生成文章列表,把它当成一个大的变量,替换模版中的变量,列表的翻页页是如此。当然,如果有信息更新的话,列表翻页也是要重新生成的。

PHP代码

$title = "http://";

$file = "TwoMax Inter test templet,
author:[email=Matrix@Two_Max]Matrix@Two_Max[/email]";

$fp = fopen ("temp.html","r");

$content = fread ($fp,filesize ("temp.html"));

$content = str_replace ("{file}",$file,$content);

$content = str_replace ("{title}",$title,$content);

// 生成列表开始

$list = '';

$sql = "select id,title,filename from article";

$query = mysql_query ($sql);

while($result = mysql_fetch_array ($query))

{

$list .= ''.$result['title'].'
';

}

$content .= str_replace("{articletable}",$list,$content);//生成列表结束

// echo $content;

$filename = "test/test.html";

$handle = fopen ($filename,"w");

//打开文件指针,创建文件

/* 检查文件是否被创建且可写 */

if(!is_writable ($filename))

{

die ("文件:".$filename."不可写,请检查其属性后重试!");

}

if(!fwrite($handle,$content))

{ //将信息写入文件

die ("生成文件".$filename."失败!");

}

fclose($handle); //关闭指针

die ("创建文件".$filename."成功!");

?>

关于翻页:

如我们指定分页时,每页20篇。某子频道列表内文章经数据库查询为45条,则,首先我们通过查询得到如下参数:1,总页数;2,每页篇数。第二步,for ($i = 0; $i < allpages; $i++),页面元素获取,分析,文章生成,都在此循环中执行。不同的是,die ("创建文件".$filename."成功!";这句去掉,放到循环后的显示,因为该语句将中止程序执行。

例:

PHP代码

$fp = fopen ("temp.html","r");

$content = fread ($fp,filesize ("temp.html"));

$onepage = '20';

$sql = "select id from article where channel='$channelid'";

$query = mysql_query ($sql);

$num = mysql_num_rows ($query);

$allpages = ceil ($num / $onepage);

for ($i = 0;$i

{

if ($i == 0)

{

$indexpath = "index.html";

}

else

{

$indexpath = "index_".$i."html";

}

$start = $i * $onepage;

$list = '';

$sql_for_page = "select name,filename,title from article where channel='$channelid' limit $start,$onepage";

$query_for_page = mysql_query ($sql_for_page);

while ($result = $query_for_page)

{

$list .= ''.$title.'
';

}

$content = str_replace("{articletable}",$list,$content);

if (is_file ($indexpath))

{

@unlink ($indexpath); //若文件已存在,则删除

}

$handle = fopen ($indexpath,"w"); //打开文件指针,创建文件

/*检查文件是否被创建且可写 */

if (!is_writable ($indexpath))

{

echo "文件:".$indexpath."不可写,请检查其属性后重试!"; //修改为echo

}

if (!fwrite ($handle,$content))

{//将信息写入文件

echo "生成文件".$indexpath."失败!"; //修改为echo

}

fclose ($handle); //关闭指针

}

fclose ($fp);

die ("生成分页文件完成,如生成不完全,请检查文件权限系统后重新生成!");

?>

third:smarty模版生成静态页面

smarty自己有一个fetch函数,其功用有点类似于fread()可以用来生成静态的页面.

这个例子大家想必看起来眼熟,对,smarty手册中关于fetch函数的例子,比竟官方的例子总是很经典的嘛!

PHP代码

include("Smarty.class.php");

$smarty = new Smarty;

$smarty->caching = true;

// only do db calls if cache doesn't exist

if(!$smarty->is_cached("index.tpl"))

{// dummy up some data

$address = "245 N 50th";

$db_data = array("City" => "Lincoln", "State" => "Nebraska", "Zip" => "68502");

$smarty->assign("Name","Fred");

$smarty->assign("Address",$address);

$smarty->assign($db_data);

}// capture the output

$output = $smarty->fetch("index.tpl");

//这个地方算是关键// do something with $output here

echo $output; //hoho 看到output的结果了吧 然后呢?fwrite一下,我们就得到我们所要的结果了。

$fp = fopen("archives/2005/05/19/0001.html", "w");

fwrite($fp, $content);

fclose($fp);

?>

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);

?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mycat+Mysql 插入数据报错 i[Err] 1064 - partition table, insert must provide ColumnList

逻辑库结构和物理库表结构如下(逻辑库结构物理库表结构)&#xff1a; CREATE TABLE order_key (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键,goods_name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 商品名称,place varchar(2…

php微信支付使用ajax,接入微信公众号支付,选择支付方式后,只弹出“error’”(php)...

这个怎么感觉不用ajax去请求什么啊&#xff1f;WeixinJSBridge不是已经封装好公众号支付的方法了吗&#xff1f;如果你已经在php里面完成统一下单过程了&#xff0c;那直接调用WeixinJSBridge的支付方法就行了&#xff1a;var jsApiParamObj <?php echo $jsApiParamList; …

企业实战_16_MyCat全局自增ID

接上一篇&#xff1a;企业实战_15_MySql主从复制到MyCat总结 https://gblfy.blog.csdn.net/article/details/118657995 文章目录一、准备工作1. Mycat全局自增实现思路2. 创建mycat数据库3. 导入初始化脚本4. 登录验证二、配置文件修改2.1. server.xml配置2.2. 添加数据节点2.3…

微服务精华问答 | 如何理解中台战略和微服务

戳蓝字“CSDN云计算”关注我们哦&#xff01;微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。今天&#xff0c;就让我们来看看关于微服务更加有深度的问题吧。1Q&#xff1a;什么是微服务A&#xff1a;1&#xff09;一组小的服务&a…

php 对象转换成数组,PHP把对象转换为数组的问题

原始对象object(Qiniu\Http\Error)#24 (2) {["url":"Qiniu\Http\Error":private]>string(25) "http://rs.qbox.me/buckets"["response":"Qiniu\Http\Error":private]>object(Qiniu\Http\Response)#25 (6) {["sta…

华为内测基于Android 10.0的EMUI 10系统;2019年Q1真无线耳机市场份额,苹果占半壁江山……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 苹果获得悬停手势专利 可隔空…

企业实战_17_MyCat水平扩展_跨分片查询_ER分片

接上一篇&#xff1a;企业实战_16_MyCat全局自增ID https://blog.csdn.net/weixin_40816738/article/details/100064315 案例比较&#xff1a; 在垂直拆分场景中&#xff0c;针对字段个数少的类型为字典类型的表&#xff0c;我们可以使用全局表的方式解决。 在水平扩展场景中&a…

bmob php支付,支付服务 - 支付服务RESTful 开发文档 - 《Bmob 文档中心》 - 书栈网 · BookStack...

注意&#xff1a;目前支付宝无法使用&#xff0c;请用户暂时不要接入&#xff0c;等待官方的恢复公告&#xff01;打款需知1.打款前请先在控制台填写以下信息2.每月的1、2、16、17号为申请打款时间&#xff0c;15号、月尾日为打款时间&#xff0c;确保用户有半个月的追诉期。Bm…

企业实战_22_MyCatSQL拦截

接上一篇&#xff1a;企业实战_21_MyCat_keepalived 安装配置验证 https://gblfy.blog.csdn.net/article/details/100073474 Mycat SQL拦截应用场景&#xff0c;可以指定监控的sql类型 文章目录1. 在server.xml文件中添加sql拦截属性标签2. 测试验证3. 查看sql拦截监控日志1. 在…

MongoDB凭什么跻身数据库排行前五?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 孙浩峰DB-Engines 数据库流行度排行榜发布了5 月份的数据&#xff0c;前六名的排名“千年不变”&#xff0c;分别是&#xff1a;Oracle、MySQL、Microsoft SQL Server、PostgreSQL、MongoDB 和IBM Db2。而其中&#xff0c;Mo…

PHP字符串运算结果,PHP 实现后缀表达式(接受四则运算字符串,输出计算结果,附代码)...

最近接触了一个有趣的需求&#xff1a;给定变量a、b、c、d等若干&#xff0c;要求由用户输入的普通四则运算字符串(包含加减乘除括号)&#xff0c;算出具体的值。例如&#xff0c;a1&#xff0c;b2&#xff0c;c3&#xff0c;d4&#xff0c;给出 ab/(d-c)&#xff0c;应计算出结…

企业实战_23_MyCat SQL防火墙

接上一篇&#xff1a;企业实战_22_MyCatSQL拦截 https://blog.csdn.net/weixin_40816738/article/details/100073474 文章目录1. SQL防火墙_白名单配置2. 白名单测试3. SQL防火墙_黑名单配置4. SQL防火墙_黑名单测试SQL防火墙&#xff1a;包括2个标签<whitehost></whi…

同样是消息队列,Kafka凭什么速度那么快?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 邴越来源 | 技术琐话Kafka的消息是保存或缓存在磁盘上的&#xff0c;一般认为在磁盘上读写数据是会降低性能的&#xff0c;因为寻址会比较消耗时间&#xff0c;但是实际上&#xff0c;Kafka的特性之一就是高吞吐率。即使是普…

企业实战_10_Mycat集成ZK实现配置同步

主机名IP地址角色数据库mycat192.168.43.32MYCAT ,MYSQL,ZKmycat&#xff08;全局自增id&#xff09;node1192.168.43.104ZKMYSQLorder_db01和order_db01node2192.168.43.217ZK,MYSQLorder_db03和order_db04node3192.168.43.172MYCAT ,MYSQLmycat&#xff08;全局自增id&#x…

亚马逊重组游戏开发部门:数个未发布游戏被“扼杀”;台积电明年开始为苹果iPhone生产5nm处理器……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 盒马送餐机器人、无人化再进…

psp中java,PSP编程概述

元旦准备买NDS&#xff0c;顺带关注了下PSP&#xff0c;其实是想&#xff0c;或许买PSP也不错~PSP很像一个平台&#xff0c;提供了很多东西&#xff0c;譬如官方的PS模拟器~在上面编程也是个不错的想法。国外的一个网站提供了很多信息&#xff0c;PS2Dev Network (http://www.p…

企业实战_18_MyCat_ZK集群安装部署

接上一篇&#xff1a;企业实战_17_MyCat水平扩展_跨分片查询_ER分片 https://gblfy.blog.csdn.net/article/details/100066013 文章目录一、使用ZK记录Mycat的配置1. 操作步骤2. 服务器部署分布二、zk集群安装部署2.1. 安装jdk并验证2.2. ZK下载2.3. node1下载同步zk2.4. 基础配…

分布式精华问答 | 分布式与集群的区别是什么?

什么是分布式计算&#xff1f;所谓分布式计算是一门计算机科学&#xff0c;它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分&#xff0c;然后把这些部分分配给许多计算机进行处理&#xff0c;最后把这些计算结果综合起来得到最终的结果。1Q&#xff1a;…

php模板解析引擎 单独,ThinkPHP模板引擎实现和常见问题

模板引擎由来早期做PHP开发WEB应用都是把PHP代码和HTML模板混在一起&#xff0c;模板引擎的诞生主要就是为了解决后端与前端的完全分离(现在来看其实是属于不完全分离)的问题&#xff0c;让开发与美工可以分工合作(虽然实际上最终模板工作大多仍然是由后端开发人员完成)&#x…

Mycat设置开机自启

接上一篇&#xff1a;实战_21_Mycat_MySql更新数据库失败 --read-only https://blog.csdn.net/weixin_40816738/article/details/100059688 下载mycat wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz解压即安装mycat tar -zxf Mycat…