ご存知のとおり、ほとんどの Web サイトのニュース情報や製品情報は静的なページです。これを行うことの主な利点は次のとおりです。 1. アクセスが高速化され、過剰なデータベース操作が回避されます。 2. SEO が最適化され、検索エンジンへの組み込みが容易になります。
この例は、CMS システムの静的ページ ソリューションに基づいており、静的 html をバッチ生成する機能を示しています。
注: この記事のプログラムは、Windows、DOS、または Linux で PHP コマンドを実行することによってのみ実行できます。
この例には主に 4 つのファイルがあります: config.inc.php (設定ファイル)、Db.class.php (データベース PDO クラス)、Model.class.php (PDO データベース操作クラス)、index.php (実行ファイル)
config.inc.php
plaincopy をクリップボードに表示print?
header('Content-Type:text/html;Charset=utf-8');
date_default_timezone_set('PRC');
define('ROOT_PATH', dirname(__FILE__)); // ルートディレクトリ
define('DB_DSN', 'mysql:host=localhost;dbname=article'); // MySQL の PDO DSN
define('DB_USER', 'root'); // データベースユーザー名
define('DB_PWD', '1715544'); // データベースパスワード (実際の状況に応じて設定してください)
関数 __autoload($className) {
require_once ROOT_PATH . ucfirst($className)
;
}
?>
header('Content-Type:text/html;Charset=utf-8');
date_default_timezone_set('PRC');
define('ROOT_PATH', dirname(__FILE__)); // ルートディレクトリ
define('DB_DSN', 'mysql:host=localhost;dbname=article'); // MySQL の PDO DSN
define('DB_USER', 'root'); // データベースユーザー名
define('DB_PWD', '1715544'); // データベースパスワード (実際の状況に応じて設定してください)
関数 __autoload($className) {
require_once ROOT_PATH . '/includes/'.ucfirst($className) .'.class.php';
}
?>
DB.class.php
plaincopy をクリップボードに表示print?
// SQL を操作します
クラスモデル {
/**
* SQL の追加、削除、変更操作では、影響を受ける行の数を返します
* @param 文字列 $sql
* @return int
*/
パブリック関数 aud($sql) {
{
を試してください
$pdo = Db::getDB();
$row = $pdo->exec($sql);
} catch (PDOException $e) {
exit($e->getMessage());
}
$row を返します。
}
/**
* すべてのデータを返し、PDOStatement オブジェクトを返します
* @param 文字列 $sql
* @return PDOStatement
*/
パブリック関数 getAll($sql) {
{
を試してください
$pdo = Db::getDB();
$result = $pdo->query($sql);
$result を返します。
} catch (PDOException $e) {
exit($e->getMessage());
}
}
}
?>
// SQL を操作します
クラスモデル{
/**
* SQL の追加、削除、変更操作では、影響を受ける行の数を返します
* @param 文字列 $sql
* @return int
*/
パブリック関数 aud($sql) {
試してみてください{
$pdo = Db::getDB();
$row = $pdo->exec($sql);
} キャッチ (PDOException $e) {
exit($e->getMessage());
}
$row を返します;
}
/**
* すべてのデータを返し、PDOStatement オブジェクトを返します
* @param 文字列 $sql
* @return PDOStatement
*/
パブリック関数 getAll($sql) {
試してみてください{
$pdo = Db::getDB();
$result = $pdo->query($sql);
$result を返します;
} キャッチ (PDOException $e) {
exit($e->getMessage());
}
}
}
?>
インデックス.php
plaincopy をクリップボードに表示print?
require_once './config.inc.php';
$m = 新しいモデル
;
$ids = $m->getAll("ID ASC 順に記事から ID を選択");
foreach ($ids as $rowIdArr) {
$idStr .= $rowIdArr['id'].',';
}
$idStr = rtrim($idStr, ',') // 全記事のID番号の集合
;
$idArr =explode(',', $idStr) // 配列に分割します
;
//次のプログラムはループして静的ページを生成します
foreach ($idArr as $articleId) {
$re = $m->getAll("SELECT id,title,date,author,source,content FROMarticle WHERE id =". $articleId); // $re は各記事のコンテンツです。 注: そのタイプは次のとおりです。 :PDOステートメント
$article = array(); // $article は各記事のタイトル、日付、著者、内容、ソースを保存する配列です
foreach ($re として $r) {
$article = array(
'タイトル'=>$r['タイトル']、
「日付」=>$r[「日付」]、
‘著者’=>$r['著者'],
‘ソース’=>$r['ソース'],
「コンテンツ」=>$r['コンテンツ']
);
}
$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 . '/templates/article.html' // $articleTemPath 記事テンプレートのパス
$articleContent = file_get_contents($articleTemPath) // テンプレートのコンテンツを取得します
;
//テンプレートに設定されている変数を置き換えます。つまり、例: テンプレート内の <{title}> をデータベースから読み取ったタイトルに置き換え、その値を変数 $articleContent に割り当てます
;
$articleContent = getArticle(array_keys($article), $articleContent, $article);
$resource = fopen($fileName, 'w');
File_put_contents($fileName, $articleContent) // HTML ファイルを書き込みます
}
/**
* getArticle($arr, $content, $article) はテンプレートを置き換えます
* @param 配列 $arr 置換変数配列
* @param string $content テンプレートのコンテンツ
* @param array $article 各記事のコンテンツの配列、形式: array('title'=>xx, 'date'=>xx, 'author'=>xx, 'source'=>xx, 'コンテンツ '=>xx);
*/
関数 getArticle($arr, $content, $article) {
// ループ置換
foreach ($arr as $item) {
$content = str_replace('<{'. $item .'}>', $article[$item], $content);
}
$content を返します。
}
?>
require_once './config.inc.php';
$m = 新しいモデル();
$ids = $m->getAll("記事から ID を選択 ID ASC で注文");
foreach ($ids as $rowIdArr) {
$idStr .= $rowIdArr['id'].',';
}
$idStr = rtrim($idStr, ',') // 全記事のID番号の集合
;
$idArr =explode(',', $idStr) // 配列に分割します
;
//次のプログラムはループして静的ページを生成します
foreach ($idArr として $articleId) {
$re = $m->getAll("SELECT id,title,date,author,source,content FROMarticle WHERE id =". $articleId); // $re は各記事のコンテンツです。 注: そのタイプは次のとおりです。 :PDOステートメント
$article = array(); // $article は各記事のタイトル、日付、著者、内容、ソースを保存する配列です
foreach ($re として $r) {
$article = 配列(
'タイトル'=>$r['タイトル'],
'日付'=>$r['日付'],
'著者'=>$r['著者'],
'ソース'=>$r['ソース'],
'コンテンツ'=>$r['コンテンツ']
);
}
$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 . '/templates/article.html' // $articleTemPath 記事テンプレートのパス
$articleContent = file_get_contents($articleTemPath) // テンプレートのコンテンツを取得します
;
//テンプレートに設定されている変数を置き換えます。例: テンプレート内の <{title}> をデータベースから読み取ったタイトルに置き換え、その値を変数 $articleContent
;
$articleContent = getArticle(array_keys($article), $articleContent, $article);
$resource = fopen($fileName, 'w');
file_put_contents($fileName, $articleContent) //HTML ファイルを書き込みます
}
* getArticle($arr, $content, $article) はテンプレートを置き換えます
* @param 配列 $arr 置換変数配列
* @param string $content テンプレートのコンテンツ
* @param array $article 各記事のコンテンツの配列、形式: array('title'=>xx, 'date'=>xx, 'author'=>xx, 'source'=>xx, 'コンテンツ '=>xx);
*/
function getArticle($arr, $content, $article) {
// ループの置き換え
foreach ($arr as $item) {
$content = str_replace('<{'. $item .'}>', $article[$item], $content);
}
$content を返します;
}
?>
(Windows DOS を例として)
実行後のスクリーンショット:
9,000 を超える HTML を生成するには約 2 分かかります。
Lee.さんのコラムより抜粋