Total Pageviews

Thursday 12 July 2018

PHP生成静态HTML的思路方法

很多网站都开始使用PHP作为网站开发的基础语言,因为它强大的功能深深吸引了程序员的目光。下面我们将为大家详细介绍有关PHP生成HTML的相关原理等。
笔者的网站曾经使用PHP这一动态技术来构建新闻发布系统,其原理也就是应用了PHP生成HTML静态页面的技术,相关平台是 Windows XP Sp2+php4.32+mysql,因此,在这里,想简单地谈一下这种做法的思路。
这篇文章适合于对PHP+MYSQL数据库操作,SQL语句以及网页设计有点基础的朋友,如果您是一个从头开始学的朋友,那么请先打好基础吧!到这里就不用往下看了。如果您都符合上述条件的话,那么恭喜您,请接着往下看。但是,在具体动手构建PHP生成HTML之前,您还要做好以下几点准备工作。
一、 PHP生成HTML需要具备本地调试PHP的功能
在WINDOWS XP操作系统下,笔者建议你可以到网上下载一个PHP+MYSQL+APHCHE的服务器套装,如华军软件园,去那里搜索一下就可以下载到。下载完后默认安装即可,这样您就具备了在本地测试PHP的功能了,省去了很多手动配置的麻烦,怎么样,简单吧,OK,这仅仅只是第一步。
二、 PHP生成HTML还要构思新闻发布系统所具备的功能
首页的新闻发布往往是通过后台更新的,后台的更新无非是由添加、编辑、删除数据等基本的功能所实现的。在这里,你可以使用网页设计软件来构建你的想要的后台界面,其功能的实现当然是要用到PHP喽。这一步建议您先想好新闻发布系统要有的功能。在这里,如何用PHP添加、编辑、删除数据就不再重复,因为重点是如何在这基础上生成静态技术。
三、 PHP生成HTML的技术原理。
哈哈。费话说了那么多,终于到了该讲的地方了。其实,这一原理并不复杂,综合地来讲的话,应该是PHP中一个替换数据语法的应用。OK,讲一个简单范例吧,一步一步地分析!相信聪明的你能看得明白的咯,仔细看好每一步即可,在这里,只是引导大家如何做而已,具体的可以实践一下!
(1)在MYSQL里新建一数据库,命名为 database (可自定义),新建一表,命名为 news(因为是新闻发布嘛,取个好记的名字即可,可自定义),然后建立这几个字段名:
id (自动递增,这是关键,类型:INT)
title (顾名思义,新闻标题,类型可取 TEXT)
content (新闻内容,类型可取 TEXT)
path (HTML文件路径,类型可取 TEXT)
(2)建立 conn.php
这是连接数据库的PHP文件,你可以把连接数据的语句单独放在这一文件里,以后多个需要连接数据库的文件直接引用这个文件即可。
(3)设计添加新闻的表格 add.form 简单的源代码如下:
新闻标题:
  • < input type=”text” size=”20”>
  • < br>   
  • 新闻内容:< textarea  cols=”10” rows=”25”>
  • < /textarea>< br>   
  • < input type=”submit”   
  • < /form> 

  • < form method=”post”  action=”add.php”>  //提交至 add.php   
  • 新闻标题:< input type=”text”  size=”20”>< br>   
  • 新闻内容:< textarea cols=”10”  rows=”25”>< /textarea>< br>   
  • < input type=”submit”   
  • < /form> 
  • (4)建立一个PHP生成HTML的模板,另存为model.htm,和 add.php可以在同一目录下。
    示例源代码:
  • < html>   
  • < body>   
  • 此新闻的标题:{title}   
  • 此新闻的内容:{content}   
  • < /body>   
  • < /html>  
  • { }大括号内的内容即是要被替换的内容,整个静态模板的设计可以根据自己的思路,但{ }内被替换的内容必须包含在内,如上面的{title},{content};咔咔~简单地说,设计好一个很好看的新闻模板后,把要被替换的如{title},{content}等标记放到需要的地方就可以了撒。
    (5)详解 add.php 源码
  • require_once(“conn.php”);  
  •  //引用conn.php,连接数据库   
  • $title=$_POST[“title”];   
  • $content=$_POST[“content”];   
  • //获得表单变量   
  • //以下建立一文本文档,其值自动计数   
  • $countfile="count.txt";   
  • if(!file_exists($countfile))   
  • {   
  • fopen($countfile,"w"); /  
  • /如果此文件不存在,则自动建立一个   
  • }   
  • $fp=fopen($countfile,"r");   
  • $num=fgets($fp,20);   
  • $num=$num+1; //每次其值自动加一   
  • fclose($fp);   
  • $fp=fopen($countfile,"w");   
  • fwrite($fp,$num); //更新其值   
  • fclose($fp);   
  • <  ?php   
  • require_once(“conn.php”);   
  • //引用conn.php,连接数据库   
  • $title=$_POST[“title”];   
  • $content=$_POST[“content”];  
  •  //获得表单变量   
  • $countfile="count.txt";   
  • if(!file_exists($countfile))   
  • {   
  • fopen($countfile,"w");  
  •  //如果此文件不存在,则自动建立一个   
  • }   
  • $fp=fopen($countfile,"r");   
  • $num=fgets($fp,20);   
  • $num=$num+1; //每次其值自动加一   
  • fclose($fp);   
  • $fp=fopen($countfile,"w");   
  • fwrite($fp,$num); //更新其值   
  • fclose($fp);   
  • $houzui=”.html”;   
  • $path=$num.$houzui;   
  • //这样形成的路径是自动增长的,如1.html, 2.html,3.html……….添加一条新闻便自动加上1   
  • //以下用SQL语句添加数据至表 news   
  • $query=mysql_query($sql);   
  • //以下为关键之处,把从表单获得的数据替换 模板中的{title},{content}标记   
  • $str=fread($fp,filesize(“mode.htm”));  
  • //读取模板中内容   
  • $str=str_replace(“{title}”,$title,$str);   
  • $str=str_replace(“{content}”,$content,$str);  
  • //替换内容   
  • fclose($fp);   
  • $handle=fopen($path,”w”);   
  • //写入方式打开新闻路径   
  • fwrite($handle,$str);   
  • //把刚才替换的内容写进生成的HTML文件   
  • fclose($handle);   
  • $fp=fopen(“model.htm”,”r”)   
  • //只读打开模板   
  • $str=fread($fp,filesize(“mode.htm”));  
  • //读取模板中内容   
  • $str=str_replace(“{title}”,$title,$str);   
  • $str=str_replace(“{content}”,$content,$str);  
  • //替换内容   
  • fclose($fp);   
  • fwrite($handle,$str);   
  • //把刚才替换的内容写进生成的HTML文件   
  • fclose($handle);  

  • OK,整个生成HTML的示例源码就到这里,其关键是用了替换的方法。
    $str=str_replace(“{被替换的内容}”,$替换的内容,$str);
    因此,总结一下以上的PHP生成HTML做法:先设计好新闻模板,把需要被替换的内容用{ }放到模板中相应的位置,然后设计表单,再是最后的表单处理程序,把从表单中获取的变量替换模板中相应的内容即可,这样每次都会生成不同的HTML;
    如果需要修改HTML的内容也是一样的,获得修改后的表单内容后,先用 update 语句更新数据库,再重新替换一下模板中的内容即可;删除的话,先delete表中要删除的内容,再用unlink($path) 来删除HTML的物理文件即可。
    --------------

    PHP生成静态HTML页面的办法与实现代码

    首先说原理。查了那么多资料,发现不管用什么方法,原理都是一样的。就是用程序读取相应的数据来替换模版中的变量,然后生成静态页。
    php中主要用到的就是要用到fread()和fwirte()。而静态页面生成了之后,就会牵扯到修改的问题。这里可以用到正则匹配的方法来替换模版中改变的部位。不过此种方法太麻烦,值得推荐的方法是直接把原来生成的模版去掉,重新生成,呵呵,真正的一了百了。
    还需要说明的一点就是,这种生成静态页面的方法一般都用于那些变化不是很频繁的页面,比如信息的最终页面。而针对列表页,如果信息更新不是很频繁的话,也是可取的。现在网上流行好多可以生成静态页面的blog或者论坛程序,都是通过手动点击后台“生成html页”的按钮来“半自动”生成html的。而对一些信息量非常大的门户网站,则行不通。因为静态页之所以叫“静态”,是因为其不可自动改变。如果信息列表每天更新100次,那么静态的列表页就要重新生成100次。如果我有10个这样的栏目,那想想也够吐血的了。
    好了,闲话少说,现在来看看实际的程序演示:
    first:是一个利用ob函数来实现的,代码比较简单,效率相对也高一些。
    代码如下:
    <?php
    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代码如下:
    <?php
    $title = “http://siyizhu.com测试模板”;
    $file = “TwoMax Inter test templet,<br>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,<br>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 .= ‘<a href=’.$root.$result[‘filename’].’ target=_blank>’.$result[‘title’].'</a><br>’;
    }
    $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<$allpages; $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 .= ‘<a href=’.$root.$result[‘filename’].’ target=_blank>’.$title.'</a><br>’;
    }
    $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代码如下:
    <?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代码如下:
    <?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);
    ?>

     

    No comments:

    Post a Comment