基于php.mysql动态网页生成静态网页技术

beauty9235 2006-03-06 11:03:49
http://beauty9235.home.sunbo.net 原创:
1: 本篇严禁转载
2: 文章如有不对之持请联系我或在本贴提出疑问,但不允许无意义回复.


一 、 引 言
本文将结合笔者实际开发过程中,基于mysql,php由动态网页生成静态网页的技术。为什么要生态静态页?在速度与功能并重的今天,网页必须有足够快的速度来运行,当你打开一个网页的时候,让你等上一分钟以前,恐怕你去了第一次,不会有第二次。于是由动态网页生成静态网页技术己成为开发网站的重要技术。

二、基础:smarty\adodb

三、开发思路:

读取数据库--->保存为数组变量---->读取模板----->返回缓冲区内容----->生成静态页

四、数据库建模

--
-- 数据库: `weekday`
--

-- --------------------------------------------------------

--
-- 表的结构 `adminuser`
--

CREATE TABLE `adminuser` (
`adminname` varchar(15) NOT NULL default '',
`adminpwd` varchar(15) NOT NULL default ''
) TYPE=MyISAM;

--
-- 导出表中的数据 `adminuser`
--

INSERT INTO `adminuser` VALUES ('admin', 'admin');

-- --------------------------------------------------------

--
-- 表的结构 `board`
--

CREATE TABLE `board` (
`id` int(11) NOT NULL auto_increment,
`parentid` int(11) NOT NULL default '0',
`idclass` varchar(15) NOT NULL default '',
`title` varchar(50) NOT NULL default '',
`content` text NOT NULL,
`username` varchar(15) NOT NULL default '',
`remoteip` varchar(50) NOT NULL default '',
`createdate` varchar(25) NOT NULL default '',
`modifydate` varchar(25) NOT NULL default '',
`email` varchar(25) NOT NULL default '',
`type` varchar(15) NOT NULL default '',
`httpadress` varchar(25) NOT NULL default '',
`hits` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=263 ;


--
-- 导出表中的数据 `board`
--

五、开发过程。

A、所需函数及扩展类的编写

生成静态页函数

//把生成文件的过程写出函数
function php_html($file_name,$file_content)
{
if (is_file ($file_name)){ //判断给定文件名是否为一个正常的文件
@unlink ($file_name); //删除文件,如果成功则返回 TRUE,失败则返回 FALSE
}
$fp = fopen ($file_name,"w"); //将 filename 指定的名字资源绑定到一个流上 ,'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
if (!is_writable ($file_name)){ //判断给定的文件名是否可写
return false;
}
if (!fwrite ($fp,$file_content)){//把 string 的内容写入文件指针 handle 处。 如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。
return false;
}
fclose ($fp); //关闭指针
return $file_name;
}

//数据库连接封装函数

function dbConnection($debug = false){

global $db;

if (!isset($db)){

global $DBTYPE,$HOST,$USER,$PASSWORD,$DATABASE;

require_once("adodb.inc.php");

$db = NewADOConnection($DBTYPE);

$db -> debug = $debug;

$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;

if(!$db->Connect($HOST, $USER, $PASSWORD, $DATABASE)){

exit("数据库错误!");

}

}

return $db;

}

至此我们的函数及类己建完成。

常量、变量设置:

$DBTYPE = "mysql"; //数据库连接类型

$HOST = "localhost"; //服务器

$USER = "root"; //用户名

$PASSWORD = ""; //用户密码

$DATABASE = "weekday"; //用户密码

//试测文件

test.php

//############################################

<?php

Error_reporting(E_ALL);

ob_start();//打开输出缓冲区当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓/冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容



//把生成文件的过程写出函数

function php_html($file_name,$file_content)

{

if (is_file ($file_name)){ //判断给定文件名是否为一个正常的文件

@unlink ($file_name); //删除文件,如果成功则返回 TRUE,失败则返回 FALSE

}

$fp = fopen ($file_name,"w"); //将 filename 指定的名字资源绑定到一个流上 ,'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。

if (!is_writable ($file_name)){ //判断给定的文件名是否可写

return false;

}

if (!fwrite ($fp,$file_content)){//把 string 的内容写入 文件指针 handle 处。 如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。

return false;

}

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

return $file_name;

}



define("_SELF_ROOT", "../");

require_once("smarty.class.php");

class TemplateSmarty extends smarty

{

function TemplateSmarty($check_error = false){

$this->template_dir = '';

$this->compile_dir = _SELF_ROOT;

$this->config_dir = '';

$this->cache_dir = '';

$this->left_delimiter = '<{';

$this->right_delimiter = '}>';

$this->debugging =$check_error;

}

}



function dbConnection($debug = false){

global $db;

if (!isset($db)){

global $DBTYPE,$HOST,$USER,$PASSWORD,$DATABASE;

require_once("adodb.inc.php");

$db = NewADOConnection($DBTYPE);

$db -> debug = $debug;

$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;

if(!$db->Connect($HOST, $USER, $PASSWORD, $DATABASE)){

exit("数据库错误!");

}

}

return $db;

}





$DBTYPE = "mysql";//数据库连接类型

$HOST = "localhost"; //服务器

$USER = "root"; //用户名

$PASSWORD = ""; //用户密码

$DATABASE = "weekday"; //数据库名

$db = dbConnection();

if($rs = $db->Execute("select * from board ")) {

while(!$rs->EOF){

$weekday[] = array(

'title' => $rs->fields['title'],

'content' => $rs->fields['content'],

);

$rs->MoveNext();

}

}





$tpl = new TemplateSmarty;

$tpl -> TemplateSmarty();

$tpl->assign('weekday', $weekday);

$tpl->display('test.tpl');

$body_content = ob_get_contents(); //返回内部缓冲区的内容,这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE.

//echo $body_content;

ob_end_clean();//删除内部缓冲区的内容,并且关闭内部缓冲区

$filename = "index.html";

if(php_html($filename,$body_content))

echo "生成成功 $filename";

else

echo "$filename没有生成成功";

?>

//############################################

test.tpl
//#################################


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
<body>
<{section name=loop loop=$weekday}>
<{$weekday[loop].title}>
<{$weekday[loop].content}>
<br>
<{/section}>


</body>
</html>
//#################################



全文完

欢迎访问个本人网站

http://beauty9235.home.sunbo.net

-- ※ Origin: 川农学子在线 <http://beauty9235.home.sunbo.net> ◆
...全文
373 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zeroleonhart 2006-03-08
  • 打赏
  • 举报
回复
直接生成静态页面不就好了么?为什么还要写进数据库里再读出来?
gu1dai 2006-03-07
  • 打赏
  • 举报
回复
友情支持一个。
pswdf 2006-03-07
  • 打赏
  • 举报
回复
理论上不错的,代码还可以优化。
比方说,已经存在的文件不用删除,还是可以FU盖。
tgq1981 2006-03-07
  • 打赏
  • 举报
回复
个人觉得PHP+XML+XSLT非常好用,占用的资源及磁盘空间都比较小,且非常灵活。

为什么这么多人用smarty。


请帮忙说说smarty比XML+XSLT有什么优点。谢谢!
Gdj 2006-03-07
  • 打赏
  • 举报
回复
太长我也没细看。但大致上感觉你的意思是用ob函数得到输出,然后存成文件的意思。
那何不直接把display换成fetch函数,把返回值直接存进文件就完了。何必又多搞一个ob出来占内存呢?
Gdj 2006-03-07
  • 打赏
  • 举报
回复
不是很明白你为什么要生成静态页。既然你都用的是smarty了。那打开cache和静态页的速度就基本没有了差别。何必多此一举。
tangcx 2006-03-07
  • 打赏
  • 举报
回复
支持。。。

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧