首页 > 未分类 > PHP批量生成静态html
2014
11-13

PHP批量生成静态html

众所周知,大部分网站的新闻资讯或商品信息都是静态页面。这样做的好处主要是为了:1、加快访问速度,避免过多的操作数据库;2、SEO优化,便于搜索引擎收录。
本示例围绕 CMS 系统的静态页面方案出发,展示批量生成静态 html 功能。
注:本文程序只能在 Windows 的 DOS 或 Linux 下执行 PHP 命令来运行。
本示例主要有4个文件:config.inc.php(配置文件)、Db.class.php(数据库 PDO 类)、Model.class.php(PDO数据库操作类)、index.php(执行文件)
config.php
<?php  
header('Content-Type:text/html;Charset=utf-8');  
date_default_timezone_set('PRC');  
define('ROOT_PATH', dirname(__FILE__)); // 根目录   
require_once './Model.class.php';  
?> 
Model.class.php
<?php  
// 操作 SQL  
class Model {  

    function __construct() {
        try {
            $this->dbh = new PDO('mysql:host=localhost;dbname=cms;','root','root',array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES 'utf8';"));
            $this->dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            echo $e->getMessage();
            exit;
        }
    }
    
    function __destruct() {
        $this->dbh = NULL;
        unset($this->dbh);
    }
    
    function query($sql,$result=0) {
        try {
            $dbh = $this->dbh;
            $stmt = $dbh->prepare($sql);
            $return = $stmt->execute();
            if ($return) {
                if ($result == 3) {
                    $retval = $dbh->lastInsertId();
                }elseif ($result == 2) {
                    $retval = $stmt->fetchAll(PDO::FETCH_ASSOC);
                }elseif ($result == 1) {
                    $retval = $stmt->fetch(PDO::FETCH_ASSOC);
                }else {
                    $retval = true;
                }
            }else {
                $retval = false;
            }
        } catch (PDOException $e) {
            $retval = array('msg'=>$e->getMessage(),'sql'=>$sql);
            $error = "SQL[{$sql}] ERR ".$e->getMessage();
        }
        
        return $retval;
    }
    
    public function update($sql) {
        try {
            
            $dbh = $this->dbh;
            $stmt = $dbh->prepare ( $sql );
            $retval = $stmt->execute ();
        
        } catch ( PDOException $e ) {
            
            $retval = $e->getMessage ();
            $this->errLog(__LINE__,__METHOD__,"ERR:{$retval} {$sql}");
        }
        return $retval;
    }

      
    /**
     * 返回全部数据,返回 PDOStatement 对象
     * @param string $sql
     * @return PDOStatement
     */  
    public function getAll($sql) {  
        try {
            $dbh = $this->dbh;
            $stmt = $dbh->prepare($sql);
            $stmt->execute();
            $retval = $stmt->fetchAll(PDO::FETCH_ASSOC);
            
        } catch (PDOException $e) {
            $retval = $e->getMessage();
        }
        return $retval;
    }  
}  
?>

index.php
<?php   
set_time_limit(0);
require_once './config.php';  
$m = new Model();  
$ids = $m->getAll("SELECT id FROM article ORDER BY id ASC ");  
$idStr = '';
foreach ($ids as $rowIdArr) {  
    $idStr .= $rowIdArr['id'].',';  
}  
$idStr = rtrim($idStr, ','); // 所有文章的 ID 号集合  
$idArr = explode(',', $idStr); // 分割成数组  
$idArrcount = count($idArr);
$i=1;
// 下面的程序循环生成静态页面  
foreach ($idArr as $articleId) {  

if($i%100==0){
sleep(2);
}
    $re = $m->getAll("SELECT a.id,title,inputtime,content FROM article AS a LEFT JOIN article_data AS d ON a.id=d.id  WHERE a.id =". $articleId); // $re 为每篇文章的内容,注意:其类型为:PDOStatement  
    $article = array(); // $article 为一个数组,保存每篇文章的title、date、author、content、source  
    foreach ($re as $r) {  
        $article = array(  
                    'title'=>$r['title'],  
                    'time'=>date('Y-m-d H:i:s',$r['inputtime']),   
                    'content'=>$r['content']  
                );  
    }  
    $articlePath = ROOT_PATH. '/article'; // $articlePath 为静态页面放置的目录  
    if (!is_dir($articlePath)) mkdir($articlePath, 0777); // 检查目录是否存在,不存在则创建  
    $fileName = ROOT_PATH . '/article/' . $articleId . '.html'; // $fileName 生成的静态文件名,格式:文章ID.html(主键ID不可能冲突)  
    $articleTemPath = ROOT_PATH . '/article.html'; // $articleTemPath 文章模板路径  
    $articleContent = file_get_contents($articleTemPath); // 获取模板里面的内容  
    // 对模板里面设置的变量进行替换。即比如:把模板里面的 <{title}> 替换成数据库里读取的 title,替换完毕赋值给变量 $articleContent  
    $articleContent = getArticle(array_keys($article), $articleContent, $article);  
    $resource = fopen($fileName, 'w');  
    file_put_contents($fileName, $articleContent); // 写入 HTML 文件  


file_put_contents('mylog.txt','时间:'.date('Y-m-d H:i:s').'--ID:'.$articleId.'--$i:'.$i."\r\n",FILE_APPEND);
++$i;
}
 
/**
 * getArticle($arr, $content, $article) 对模板进行替换操作
 * @param array $arr 替换变量数组
 * @param string $content 模板内容
 * @param array $article 每篇文章内容数组,格式:array('title'=>xx, 'date'=>xx, 'author'=>xx, 'source'=>xx, 'content'=>xx);
 */  
function getArticle($arr, $content, $article) {  
    // 循环替换  
    foreach ($arr as $item) {  
        $content = str_replace('<{'. $item .'}>', $article[$item], $content);  
    }  
    return $content;  
}  
?>

article.html
<html>
<head>
<meta charset="utf-8"/>
<title><{title}></title>
</head>
</body>
<center><h1><{title}></h1></center>
<center><p><{time}></p></center>
<hr/>
<div><{content}></div>
</body>
</html>

来源:原创

友荐云推荐