Home > Article > Backend Development > PHP batch generate static html_PHP tutorial
As we all know, most websites’ news information or product information are static pages. The main benefits of doing this are: 1. Speeding up access and avoiding excessive database operations; 2. SEO optimization to facilitate search engine inclusion.
This example is based on the static page solution of the CMS system and demonstrates the function of batch generating static html.
Note: The program in this article can only be run by executing PHP commands under Windows, DOS or Linux.
This example mainly has 4 files: config.inc.php (configuration file), Db.class.php (database PDO class), Model.class.php (PDO database operation class), index.php (execution file )
config.inc.php
view plaincopy to clipboardprint?
header('Content-Type:text/html;Charset=utf-8');
date_default_timezone_set('PRC');
define('ROOT_PATH', dirname(__FILE__)); // Root directory
define('DB_DSN', 'mysql:host=localhost;dbname=article'); // MySQL's PDO dsn
define('DB_USER', 'root'); // Database user name
define('DB_PWD', '1715544'); // Database password (please set it according to the actual situation)
function __autoload($className) {
require_once ROOT_PATH . '/includes/'. ucfirst($className) .'.class.php';
}
?>
header('Content-Type:text/html;Charset=utf-8');
date_default_timezone_set('PRC');
define('ROOT_PATH', dirname(__FILE__)); // Root directory
define('DB_DSN', 'mysql:host=localhost;dbname=article'); // MySQL's PDO dsn
define('DB_USER', 'root'); // Database user name
define('DB_PWD', '1715544'); // Database password (please set it according to the actual situation)
function __autoload($className) {
require_once ROOT_PATH . '/includes/'. ucfirst($className) .'.class.php';
}
?>
Db.class.php
view plaincopy to clipboardprint?
// Connect to database
class Db {
static public function getDB() {
try {
$pdo = new PDO(DB_DSN, DB_USER, DB_PWD);
$pdo->setAttribute(PDO::ATTR_PERSISTENT, true); // Set the database connection to a persistent connection
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Setup throws an error
$pdo->setAttribute(PDO::ATTR_ORACLE_NULLS, true); // Set when the string is empty, it is converted to NULL in SQL
$pdo->query('SET NAMES utf8'); // Set database encoding
} catch (PDOException $e) {
exit('Database connection error, error message:'. $e->getMessage());
}
return $pdo;
}
}
?>
//Connect to database
class Db {
static public function getDB() {
try {
$pdo = new PDO(DB_DSN, DB_USER, DB_PWD);
$pdo->setAttribute(PDO::ATTR_PERSISTENT, true); //Set the database connection as a persistent connection
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set throw error
$pdo->setAttribute(PDO::ATTR_ORACLE_NULLS, true); //Set when the string is empty, it is converted to SQL NULL
$pdo->query('SET NAMES utf8'); // Set database encoding
} catch (PDOException $e) {
exit('Database connection error, error message:'. $e->getMessage());
}
return $pdo;
}
}
?>
Model.class.php
view plaincopy to clipboardprint?
// 操作 SQL
class Model {
/**
* SQL addition, deletion and modification operations, return the number of affected rows
* @param string $sql
* @return int
*/
public function aud($sql) {
try {
$pdo = Db::getDB();
$row = $pdo->exec($sql);
} catch (PDOException $e) {
exit($e->getMessage());
}
return $row;
}
/**
* Return all data, return PDOStatement object
* @param string $sql
* @return PDOStatement
*/
public function getAll($sql) {
try {
$pdo = Db::getDB();
$result = $pdo->query($sql);
return $result;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
}
?>
// 操作 SQL
class Model {
/**
* SQL addition, deletion and modification operations, return the number of affected rows
* @param string $sql
* @return int
*/
public function aud($sql) {
try {
$pdo = Db::getDB();
$row = $pdo->exec($sql);
} catch (PDOException $e) {
exit($e->getMessage());
}
return $row;
}
/**
* Return all data and return PDOStatement object
* @param string $sql
* @return PDOStatement
*/
public function getAll($sql) {
try {
$pdo = Db::getDB();
$result = $pdo->query($sql);
return $result;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
}
?>
index.php
view plaincopy to clipboardprint?
require_once './config.inc.php';
$m = new Model();
$ids = $m->getAll("SELECT id FROM article ORDER BY id ASC");
foreach ($ids as $rowIdArr) {
$idStr .= $rowIdArr['id'].',';
}
$idStr = rtrim($idStr, ','); // Collection of ID numbers of all articles
$idArr = explode(',', $idStr); // Split into arrays
// The following program loops to generate static pages
foreach ($idArr as $articleId) {
$re = $m->getAll("SELECT id,title,date,author,source,content FROM article WHERE id =". $articleId); // $re is the content of each article. Note: its type is :PDOStatement
$article = array(); // $article is an array, saving the title, date, author, content, source of each article
foreach ($re as $r) {
$article = array(
'title'=>$r['title'],
‘date’=>$r['date'],
‘author’=>$r['author'],
'source'=>$r['source'],
'content'=>$r['content']
);
}
$articlePath = ROOT_PATH. '/article'; // $articlePath is the directory where static pages are placed
If (!is_dir($articlePath)) mkdir($articlePath, 0777); // Check whether the directory exists, create it if it does not exist
$fileName = ROOT_PATH . '/article/' . $articleId . '.html'; // Static file name generated by $fileName, format: article ID.html (primary key ID cannot conflict)
$articleTemPath = ROOT_PATH . '/templates/article.html'; // $articleTemPath article template path
$articleContent = file_get_contents($articleTemPath); // Get the content in the template
//Replace the variables set in the template. That is, for example: replace <{title}> in the template with the title read from the database, and then assign the value to the variable $articleContent
$articleContent = getArticle(array_keys($article), $articleContent, $article);
$resource = fopen($fileName, 'w');
File_put_contents($fileName, $articleContent); // Write HTML file
}
/**
* getArticle($arr, $content, $article) replaces the template
* @param array $arr replacement variable array
* @param string $content template content
* @param array $article Array of content of each article, format: array('title'=>xx, 'date'=>xx, 'author'=>xx, 'source'=>xx, 'content '=>xx);
*/
function getArticle($arr, $content, $article) {
// Loop replacement
foreach ($arr as $item) {
$content = str_replace('<{'. $item .'}>', $article[$item], $content);
}
Return $content;
}
?>
require_once './config.inc.php';
$m = new Model();
$ids = $m->getAll("SELECT id FROM article ORDER BY id ASC");
foreach ($ids as $rowIdArr) {
$idStr .= $rowIdArr['id'].',';
}
$idStr = rtrim($idStr, ','); // Collection of ID numbers of all articles
$idArr = explode(',', $idStr); // Split into arrays
//The following program loops to generate static pages
foreach ($idArr as $articleId) {
$re = $m->getAll("SELECT id,title,date,author,source,content FROM article WHERE id =". $articleId); // $re is the content of each article. Note: its type is :PDOStatement
$article = array(); // $article is an array, saving the title, date, author, content, source of each article
foreach ($re as $r) {
$article = array(
'title'=>$r['title'],
'date'=>$r['date'],
'author'=>$r['author'],
'source'=>$r['source'],
'content'=>$r['content']
);
}
$articlePath = ROOT_PATH. '/article'; // $articlePath is the directory where static pages are placed
if (!is_dir($articlePath)) mkdir($articlePath, 0777); // Check whether the directory exists, create it if it does not exist
$fileName = ROOT_PATH . '/article/' . $articleId . '.html'; // Static file name generated by $fileName, format: article ID.html (primary key ID cannot conflict)
$articleTemPath = ROOT_PATH . '/templates/article.html'; // $articleTemPath article template path
$articleContent = file_get_contents($articleTemPath); // Get the content in the template
//Replace the variables set in the template. That is, for example: replace <{title}> in the template with the title read from the database, and assign the value to the variable $articleContent
after the replacement.
$articleContent = getArticle(array_keys($article), $articleContent, $article);
$resource = fopen($fileName, 'w');
file_put_contents($fileName, $articleContent); //Write HTML file
}
/**
* getArticle($arr, $content, $article) replaces the template
* @param array $arr replacement variable array
* @param string $content template content
* @param array $article Array of content of each article, format: array('title'=>xx, 'date'=>xx, 'author'=>xx, 'source'=>xx, 'content '=>xx);
*/
function getArticle($arr, $content, $article) {
// Loop replacement
foreach ($arr as $item) {
$content = str_replace('<{'. $item .'}>', $article[$item], $content);
}
return $content;
}
?>
Run the screenshot (Windows DOS as an example)
Screenshot after running:
It takes about 2 minutes to generate more than 9,000 html.
Excerpted from Lee.’s column