• 技术文章 >php教程 >PHP源码

    PHP总结我的简单静态页生成 过程,

    2016-06-08 17:33:22原创563
    一直用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代码:

    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
    "$row[title]
    "
    ;
    }
    ?>


    比如生成了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代码:

    $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内容到剪贴板
    PHP代码:

    header("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倍左右。
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:nbsp html quot PHP news
    上一篇:可以文本显示的公告栏 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 检测移动设备的php代码(手机访问)• php实用图片水印效果代码• php中$_SERVER['HTTP_USER_AGENT']判断是否为手机访问网站• php 列出目录与删除目录实例代码• php多文件上传
    1/1

    PHP中文网