php简单静态页生成过程
2015-01-24信息快讯网
一直用smarty的cache,但感觉还是要自己做一个,才有感觉。网上有很多牛人的功能比较完备,打算先自己搞简单的再慢慢丰满。这两天做了一个比较简单的,在hi.baidu.net/alex_wang58记录一下。
一、用到的相关技术关键词:PHP, Apache,mod_rewrite (RewriteCond,RewriteRule)地址重写,
ob系列函数缓冲
file_put_contents生成html
二、流程:用户发出请求url?id=x ,判断文章是否存在
(1)存在则直接转到对应的Html页面。
(2)不存在通过php读取数据库数据,然后生成html文件,并存放到指定目录。
三、实现方法:
(1)地址重写用Apahce的mod_rewrite模块中的RewriteRule指令实现重写(mod_rewrite的开启和简单规则见本博另一篇http://hi.baidu.com/alex%5Fwang5 ... 0346ffb3fb952e.html )。
(2)判断文章是否存在用Apahce 的mod_rewrite模块中的RewriteCond指令
(3)生成html文件:
ob_star()打开缓冲,将读取文章的php包含进来,然后用file_put_contents将获得的缓冲内容写入指定HTMl文件。
四、代码
/Test 目录下的 .htaccess 文件内容:
RewriteEngine On
RewriteRule ^index.html$ /news.php [L]
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^html/news_([0-9]+).html$ getnews.php?id=$1 [L]
对news.php的访问将通过 localhost/Test/index.html 实现由第二句 RewriteRule ^index.html$ Test/news.php [L] 实现
news.php =============================> news.php将列出文章标题链接。
<?php header("Content-Type:text/html; charset=gbk"); //以防出现乱码 mysql_connect("localhost","root",""); mysql_query('SET NAMES gbk'); //我的数据库用的gbk编码,请根据自己实际情况调整 mysql_select_db("test"); $sql = "Select `id`,`title` FROM `arc` order by `id` DESC"; $rs = mysql_query($sql); while($row = mysql_fetch_array($rs) ){ echo "<a href='/Test/html/news_$row[id].html'>$row[title]</a><br>"; } ?>
比如生成了<a href='/Test/html/news_3.html'>php静态页实现</a>
当点击链接发出对 http://localhost/Test/html/news_3.html 的请求时
Apache将会判断 news_3.html 是否存在,由 .htaccess中的第三句
RewriteCond %{REQUEST_FILENAME} !-s
实现:
RewriteCond 是“定向重写发生条件”。REQUEST_FILENAME 这个参数是“客户端请求的文件名”
'-s' (是一个非空的常规文件[size]) 测试指定文件是否存在而且是一个尺寸大于0的常规的文件. !表示匹配条件的反转。
所以 RewriteCond 这句就表示当请求链接不存在时 执行下面的 RewriteRule 规则。
所以当请求的news_3.html 不存在时会重写地址让 getnews.php?id=3 来处理(否则如果news_3.html 存在则直接就加载该html文件)。
getnews.php ===================>功能:判断参数传输的完整性,并调用相应文件生成html文件。
<?php $id =$_GET['id']; $root =& $_SERVER['DOCUMENT_ROOT']; $filename = "news_".$id.".html"; $file = $root."/Test/html/".$filename; ob_start(); include($root."/Test/newsDetail.php"); file_put_contents($file,ob_get_contents()); ob_end_flush(); ?>
newsDetail.php ====================> 从数据库中读取数据,产生新闻内容,内容被getnews.php捕获
<?php header("Content-Type:text/html; charset=gbk"); if( isset($_GET['id']) ){ $id = & $_GET['id']; }else{ header("Location: http://127.0.0.1/lean/Test/html/news_failed.html"); exit(); } mysql_connect("localhost","root",""); mysql_query('SET NAMES gbk'); mysql_select_db("test"); $id =$_GET['id']; $sql = "Select `news` FROM `arc` Where `id`=$id"; $rs = mysql_query($sql); while($row = mysql_fetch_array($rs) ){ echo $row['news']; } ?>
这样将会在/Test/html 目录下产生以 news_文章ID.html 命名的html文件。
PS: 一开始在判断是否存在相应html页面时采用的是 php 内置的 file_exists() 判断,而不用Apache的 RewriteCond,也即没有 RewriteCond %{REQUEST_FILENAME} !-s。看似可行,但结果会产生“循环重定向”的问题。
当news_3.html 不存在时 我们需要用 getnews.php生成news_3.html ,生成完毕后需要转向到 news_3.html ,于是又形成了一次请求mod_rewrite又启动把 news_3.html重写为 getnews.php?id=3 这就形成了死循环了。所以把文件存在性的判断交给 RewriteCond ,指定的html文件不存在时才启用重写规则。这样循环重定向的问题就没有了。
一开始没有采用fopen打开newsDetail.php,然后再将生成的内容fwrite成html文件,然后include输出静态页面。后来在fhjr999的提醒下,改为:将newDetail.php包含进getnews.php,通过ob系列函数将生成的内容放入缓冲,然后再生成html文件。ob的效率是前者的20倍左右。
php下使用SimpleXML 处理XML 文件
PHP 导出数据到淘宝助手CSV的方法分享
php str_pad() 将字符串填充成指定长度的字符串
php 用checkbox一次性删除多条记录的方法
PHP实现域名whois查询的代码(数据源万网、新网)
用PHP ob_start()控制浏览器cache、生成html实现代码
php 生成静态页面的办法与实现代码详细版
PHP生成网页快照 不用COM不用扩展.
php 生成随机验证码图片代码
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
php生成xml简单实例代码
Php Mssql操作简单封装支持存储过程
一个比较简单的PHP 分页分组类
php读取html并截取字符串的简单代码
超级简单的php+mysql留言本源码
谈PHP生成静态页面分析 模板+缓存+写文件
php 静态页面中显示动态内容
php2html php生成静态页函数
方便实用的PHP生成静态页面类(非smarty)第1/2页
PHP 5.0对象模型深度探索之属性和方法
优化PHP代码的53条建议
PHP连接access数据库
php 无限极分类
有关 PHP 和 MySQL 时区的一点总结
用phpmyadmin更改mysql5.0登录密码
利用PHP制作简单的内容采集器的代码
php在线生成ico文件的代码
一些常用的php简单命令代码集锦
php下实现伪 url 的超简单方法[转]
PHP生成月历代码
PHP静态新闻列表自动生成代码
[php] 我的微型论坛的简单教程[已完成]第1/8页
mysql 搜索之简单应用
php下用GD生成生成缩略图的两个选择和区别
用PHP实现的生成静态HTML速度快类库
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
生成静态页面的php函数,php爱好者站推荐
用缓存实现静态页面的测试
PHP生成静态页面详解
PHP生成静态页