如何使用PHP批量生成静态html页面

来源:互联网 发布:手机淘宝如何修改密码 编辑:程序博客网 时间:2024/05/16 19:32
众所周知,大部分网站的新闻资讯或商品信息都是静态页面。这样做的好处主要是为了: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 2header('Content-Type:text/html;Charset=utf-8'); 3date_default_timezone_set('PRC'); 4define('ROOT_PATH', dirname(__FILE__)); // 根目录  5require_once './Model.class.php'; 6?>

Model.class.php

<?php 02// 操作 SQL 03class Model { 04 05    function __construct() {06        try {07            $this->dbh = new PDO('mysql:host=localhost;dbname=cms;','root','root',array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES 'utf8';"));08            $this->dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);09        } catch (PDOException $e) {10            echo $e->getMessage();11            exit;12        }13    }14     15    function __destruct() {16        $this->dbh = NULL;17        unset($this->dbh);18    }19     20    function query($sql,$result=0) {21        try {22            $dbh = $this->dbh;23            $stmt = $dbh->prepare($sql);24            $return = $stmt->execute();25            if ($return) {26                if ($result == 3) {27                    $retval = $dbh->lastInsertId();28                }elseif ($result == 2) {29                    $retval = $stmt->fetchAll(PDO::FETCH_ASSOC);30                }elseif ($result == 1) {31                    $retval = $stmt->fetch(PDO::FETCH_ASSOC);32                }else {33                    $retval = true;34                }35            }else {36                $retval = false;37            }38        } catch (PDOException $e) {39            $retval = array('msg'=>$e->getMessage(),'sql'=>$sql);40            $error = "SQL[{$sql}] ERR ".$e->getMessage();41        }42         43        return $retval;44    }45     46    public function update($sql) {47        try {48             49            $dbh = $this->dbh;50            $stmt = $dbh->prepare ( $sql );51            $retval = $stmt->execute ();52         53        } catch ( PDOException $e ) {54             55            $retval = $e->getMessage ();56            $this->errLog(__LINE__,__METHOD__,"ERR:{$retval} {$sql}");57        }58        return $retval;59    }60 61       62    /**63     * 返回全部数据,返回 PDOStatement 对象64     * @param string $sql65     * @return PDOStatement66     */ 67    public function getAll($sql) { 68        try {69            $dbh = $this->dbh;70            $stmt = $dbh->prepare($sql);71            $stmt->execute();72            $retval = $stmt->fetchAll(PDO::FETCH_ASSOC);73             74        } catch (PDOException $e) {75            $retval = $e->getMessage();76        }77        return $retval;78    } 79} 80?>

index.php

<?php  02set_time_limit(0);03require_once './config.php'; 04$m = new Model(); 05$ids = $m->getAll("SELECT id FROM article ORDER BY id ASC "); 06$idStr = '';07foreach ($ids as $rowIdArr) { 08    $idStr .= $rowIdArr['id'].','; 09} 10$idStr = rtrim($idStr, ','); // 所有文章的 ID 号集合 11$idArr = explode(',', $idStr); // www.onesheng.cn分割成数组 12$idArrcount = count($idArr);13$i=1;14// 下面的程序循环生成静态页面 15foreach ($idArr as $articleId) { 16 17if($i%100==0){18sleep(2);19}20    $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 21    $article = array(); // $article 为一个数组,保存每篇文章的title、date、author、content、source 22    foreach ($re as $r) { 23        $article = array( 24                    'title'=>$r['title'], 25                    'time'=>date('Y-m-d H:i:s',$r['inputtime']),  26                    'content'=>$r['content'] 27                ); 28    } 29    $articlePath = ROOT_PATH. '/article'; // $articlePath 为静态页面放置的目录 30    if (!is_dir($articlePath)) mkdir($articlePath, 0777); // 检查目录是否存在,不存在则创建 31    $fileName = ROOT_PATH . '/article/' . $articleId . '.html'; // $fileName 生成的静态文件名,格式:文章ID.html(主键ID不可能冲突) 32    $articleTemPath = ROOT_PATH . '/article.html'; // $articleTemPath 文章模板路径 33    $articleContent = file_get_contents($articleTemPath); // 获取模板里面的内容 34    // 对模板里面设置的变量进行替换。即比如:把模板里面的 <{title}> 替换成数据库里读取的 title,替换完毕赋值给变量 $articleContent 35    $articleContent = getArticle(array_keys($article), $articleContent, $article); 36    $resource = fopen($fileName, 'w'); 37    file_put_contents($fileName, $articleContent); // 写入 HTML 文件 38 39 40file_put_contents('mylog.txt','时间:'.date('Y-m-d H:i:s').'--ID:'.$articleId.'--$i:'.$i."\r\n",FILE_APPEND);41++$i;42}43  44/**45 * getArticle($arr, $content, $article) 对模板进行替换操作46 * @param array $arr 替换变量数组47 * @param string $content 模板内容48 * @param array $article 每篇文章内容数组,格式:array('title'=>xx, 'date'=>xx, 'author'=>xx, 'source'=>xx, 'content'=>xx);49 */ 50function getArticle($arr, $content, $article) { 51    // 循环替换 52    foreach ($arr as $item) { 53        $content = str_replace('<{'. $item .'}>', $article[$item], $content); 54    } 55    return $content; 56} 57?>

article.htm

<html>02<head>03<meta charset="utf-8"/>04<title><{title}></title>05</head>06</body>07<center><h1><{title}></h1></center>08<center><p><{time}></p></center>09<hr/>10<div><{content}></div>11</body>12</html>


0 0