php源码 静态,PHP总结我的简单静态页生成过程,-PHP源码

《script》ec(2);《script》

一直用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内容到剪贴板

PHP代码:

("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;

}?>

比如生成了php静态页实现

当点击链接发出对 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内容到剪贴板

PHP代码:

=$_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内容到剪贴板

PHP代码:

("Content-Type:text/html; charset=gbk");

if( isset($_GET['id']) ){$id= &$_GET['id'];

}else{header("Location: [url]http://127.0.0.1/lean/Test/html/news_failed.html[/url]");

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倍左右。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值