PHP 动态生成静态页类——封装动态生成静态页方法,PHP动态生成静态页类可将PHP动态页面生成静态页面,这不仅可以有效地提高站点的访问效率、降低服务器负载,而且可以提高被搜索引擎搜索到的几率。这里将PHP动态生成静态页面的方法进行了整理,封装到类中,以方便使用。
PHP 动态生成静态页类 语法
/*********************************************
* @ 说明:PHP 动态生成静态页类
*********************************************/
class MakeStaticPage{
var dirName;
varrequestUrl;
var defaultIndexPage;
varstaticPageExtendsName;
var cacheTime;
/*
* @ 方法说明:
* 构造方法,类的初始化
*
* @ 参数说明:
*dirName:保存静态页的目录
* requestUrl:请求页面地址
*defaultIndexPage:默认主页
* staticPageExtendsName:静态页面扩展名
*cacheTime:重新生成静态页面的时间
*/
function MakeStaticPage (dirName,requestUrl, cacheTime = -1,defaultIndexPage =
'index', staticPageExtendsName = '.shtml'){this->dirName = dirName;this->requestUrl = requestUrl;this->defaultIndexPage = defaultIndexPage;this->staticPageExtendsName = staticPageExtendsName;this->cacheTime = cacheTime;
}
/*
* @ 方法说明:
* 根据请求的URL 获取静态页面的名称
*
* @ 参数说明:
*requestUrl:请求页面地址
* defaultIndexPage:默认主页
*staticPageExtendsName:静态页面扩展名
*/
function getStaticPageName (requestUrl,defaultIndexPage = 'index', staticPage
ExtendsName = '.shtml'){arrayUrl = parse_url(requestUrl); //解析请求地址path = arrayUrl['path']; //请求地址的路径部分arrayTmpPath = array_reverse(explode('/', path));mainName = str_replace('.php', '', arrayTmpPath[0]);//获取请求页面的主名
if (mainName == '') {
mainName =defaultIndexPage;
}
if(isset(arrayUrl['query'])){query = arrayUrl['query']; //请求地址的参数部分
}else{query = ''; //请求地址的参数部分为空
}
arrayQueryString = array();
parse_str(query, arrayQueryString);arrayQueryStringValue = array_values(arrayQueryString);queryString = '';
foreach (arrayQueryStringValue astmpQuery) { //提取所有参数的值并用“-”号连接
queryString .= '-' .tmpQuery;
}
return mainName .queryString . staticPageExtendsName;
}
/*
* @ 方法说明:
* 获取生成静态页的全部路径
*/
function getStaticPagePath (){
returnthis->dirName . '/' . this->getStaticPageName(this->requestUrl,
this->defaultIndexPage,this->staticPageExtendsName);
//根据当前URL 请求,返回生成静态页面的完整路径
}
/*
* @ 方法说明:
* 定义生成静态页的开始位置
*/
function pageBegin (){
ob_start();
}
/*
* @ 方法说明:
* 定义生成静态页的结束位置
*/
function pageEnd (){
if (! is_dir(this->dirName)) { //判断保存静态页面的目录是否存在,不存在则创建
mkdir(this->dirName);
}
content = ob_get_contents(); //获取请求URL 的静态内容,并保存到静态页面中fp = fopen(this->getStaticPagePath(), 'w');
fwrite(fp, content);
ob_flush();
}
/*
* @ 方法说明:
* 重定向到静态页面的条件,其他条件在编写程序时指定
*/
function isLocationToStaticPage (nowPage, pageArray = null,sessionArray = null){
path =this->getStaticPagePath();
//如果当前请求的静态文件存在或者静态文件上次被修改的时间与缓存时间的和小于当前时间则返回true
if (! file_exists(path) ||this->cacheTime != - 1 && time() - filemtime(path) >this->cacheTime) {
return false;
} else {
if (pageArray != null) {
foreach (pageArray as tmpNowPage) {
//这里不用array_search()是因为第一个元素下标为0,if 语句判断时为false
if (trim(tmpNowPage) == nowPage) {
return false;
exit();
}
}
}
if (sessionArray != null) {
foreach (sessionArray astmpSessionArray) {
if (trim(tmpSessionArray) ==nowPage) {
return false;
exit();
}
}
}
return true;
}
}
}
PHP 动态生成静态页类 示例
本实例应用PHP动态生成静态页类、ADODB连接数据库类和ADODB分页类完成数据库中数据的静态分页输出。
(1)在本实例通过ADODB连接数据库类连接MySQL数据库,其存储于ConnDB.php文件中。
(2)通过ADODB分页类PageDB实现数据的分页显示,该类存储于PageDB.php文件中。
(3)创建MakeStaticPage类动态生成静态页面,其存储于MakeStaticPage.php文件中。
说明
StaticPage类中生成静态页的方法是真正意义上的生成静态页面,而非伪静态,其好处是不受服务器限制,如果使用伪静态的方法则要开启Apache服务器的Rewrite功能,如果用户使用租用的空间,可能有些空间提供商未提供上述技术支持。
(4)创建pkh.inc.php文件,完成静态页面处理的前期准备工作,开启缓存,完成与数据库的连接和分页类的实例化。代码如下:
<?php
/*********************************以下为静态页处理****************************/
session_start();
arrayIni = parse_ini_file('config/pkhConfig.ini');
require_once 'library/MakeStaticPage.php';makeStaticPage = new MakeStaticPage(arrayIni['dirName'],_SERVER['REQUEST_URI'],
arrayIni['cacheTime'],arrayIni['defaultIndexPage'],
arrayIni['staticPageExtendsName']);nowPage = basename(_SERVER['PHP_SELF']);pageArray = explode(',', arrayIni['pageArray']); //始终不显示静态页的PHP 页面
if (isset(_SESSION['unc']) && _SESSION['unc']!=''){ //用户登录后指定不显示静态页的PHP 页面sessionArray = explode(',', arrayIni['sessionArray']);
}else{sessionArray = null;
}
if (makeStaticPage->isLocationToStaticPage(nowPage, pageArray,sessionArray)) {
header('location:' . makeStaticPage->getStaticPagePath());
//将当前请求的页面定位到与之对应的静态页面
exit();
}strlen=strripos(_SERVER['SCRIPT_NAME'],"/")+1; //获取相对路径的字符串数目baseUrl=substr(_SERVER['SCRIPT_NAME'],0,strlen); //截取相对路径
makeStaticPage->pageBegin(); //开启缓存
/***************************以下为具体网页内容****************************/
require_once 'library/ConnDB.php'; //包含数据库连接类
require_once 'library/PageDB.php'; //包含分页类
include_once 'library/function.php';connObj = new ConnDB(arrayIni['dbType'] ,arrayIni['host'] ,arrayIni['userName'],arrayIni['password'] ,arrayIni['dbName'] ,arrayIni['isDebug']);
connID =connObj->getConnID ();
$pageObj = new PageDB ( ); //实例化分页类
(5)创建index.php文件,载入pkh.inc.php文件,完成数据库中数据的分页输出,最后关闭数据库连接,关闭缓存。其关键代码如下:
<?php
require_once 'pkh.inc.php'; //载入静态页生成文件
?>
…//省略了主页的部分代码
<?php
connObj->closeConnID(); //关闭MySQL 数据库makeStaticPage->pageEnd(); //关闭缓存
?>