先來看看PHP在服務器的執行過程:當用戶請求服務器php文件的時候,服務器將對php文件進行語法分析,其次是解析,最后才運行。當php文件有內容輸出時,該內容會先經過服務器的php的緩沖區(buffer),然后再通過TCP傳遞到客戶端。(buffer其實就是緩沖區,一個內存地址空間,主要用於存儲數據區域)
可見,如果用戶直接訪問靜態頁面的時候,服務器的響應時間一般會比訪問動態文件的時間短。如果我們能把用戶將要訪問的動態文件先轉化為靜態文件即可加快用戶訪問頁面的速度(獲取網頁的速度)。當然我們要注意靜態化的應用場景,頁面的靜態化主要應用於那些頁面內容不經常改動的頁面。
關於靜態化,PHP的靜態化分為:純靜態和偽靜態。其中純靜態又分為:局部純靜態和全部純靜態。這里將的是全部純靜態。
這里先介紹幾個關於PHP緩沖區的相關函數:
ob_start 打開輸出控制緩沖(要求php開啟緩存,在php配置文件php.ini文件中可以設置 output_buffering = on)
ob_get_contents 返回輸出緩沖區內容
ob_clean 清空(擦掉)輸出緩沖區
ob_get_clean 得到當前緩沖區的內容並刪除當前輸出緩沖區
php生成文件的函數 file_put_contents('文件路徑','文件內容')。(當然php中還有其他寫文件的方法,如fwrite)
下面有個demo01的案例,目錄結構為:

我們先來創建一個 mooc_cms 數據庫,創建表 news,如下:

並且插入多條數據,如下:

創建一個數據庫的操作類 db.php
<?php
/**
* 數據庫連接封裝
*/
class Db {
//存儲類的實例的靜態成員變量
private static $_instance;
//數據庫鏈接靜態變量
private static $_connectSource;
//連接數據庫配置
private $_dbConfig = array(
'host' => '127.0.0.1',
'user' => 'root',
'password' => '',
'database' => 'mooc_cms'
);
index.php (根據靜態文件失效的時間,判斷是否重新生成靜態文件 index.shtml)
- <?php
-
-
-
- if(is_file('index.shtml') && (time() - filemtime('index.shtml')) < 300) {
- require_once('index.shtml');
- } else {
- require_once('db.php');
-
- $connect = Db::getInstance()->connect();
- $sql = "SELECT * FROM news WHERE `category_id` = 1 AND `status` = 1 ORDER BY id DESC LIMIT 5";
- $result = mysql_query($sql, $connect);
- $news = array();
- while($row = mysql_fetch_array($result)) {
- $news[] = $row;
- }
-
-
- ob_start();
-
-
- require_once('templates/singwa.php');
- file_put_contents('index.shtml', ob_get_contents());
-
-
-
-
-
- }
-
- ?>
singwa.php(使用bootstrap框架做界面)
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>新聞中心</title>
- <link rel="stylesheet" href="public/css/bootstrap.min.css" type="text/css">
- </head>
- <body>
- <div class="container">
- <h3>新聞列表</h3>
- <ul class="list-group">
- <?php foreach ($news as $key => $value) { ?>
- <li class="list-group-item"><a href="#"><?php echo $value['title'];?></a></li>
- <?php } ?>
- </ul>
- </div>
- </body>
- </html>
當我們第一次訪問 index.php時,服務器將為我們生成一個靜態文件index.shtml。

出現 index.shtml文件:

index.shtml
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>新聞中心</title>
- <link rel="stylesheet" href="public/css/bootstrap.min.css" type="text/css">
- </head>
- <body>
- <div class="container">
- <h3>新聞列表</h3>
- <ul class="list-group">
- <li class="list-group-item"><a href="#">今天有一條新聞7</a></li>
- <li class="list-group-item"><a href="#">今天有一條新聞6</a></li>
- <li class="list-group-item"><a href="#">今天有一條新聞5</a></li>
- <li class="list-group-item"><a href="#">今天有一條新聞4</a></li>
- <li class="list-group-item"><a href="#">今天有一條新聞3</a></li>
- </ul>
- </div>
- </body>
- </html>
當我們不超過300秒,再次訪問index.php時,服務器將訪問靜態文件index.shtml給我們訪問。而當靜態文件過期后,我們再次訪問index.php,服務器將為我們更新index.shtml靜態文件。
這里講到的只是一種觸發靜態文件更新的方法,當然還有:手動觸發更新(設置后台管理,管理員想立即更新靜態文件,就點擊運行生成靜態文件即可)、Linux服務器下的crontab定時掃描程序(在linux服務器下,設置命令:
* /1 * * * * php 路徑+文件名 ==> 代表 每一分鍾系統將執行一次指定文件

文件內容可以為:
- require_once('db.php');
-
- $connect = Db::getInstance()->connect();
- $sql = "SELECT * FROM news WHERE `category_id` = 1 AND `status` = 1 ORDER BY id DESC LIMIT 5";
- $result = mysql_query($sql, $connect);
- $news = array();
- while($row = mysql_fetch_array($result)) {
- $news[] = $row;
- }
-
-
- ob_start();
-
-
- require_once('templates/singwa.php');
- file_put_contents('index.shtml', ob_get_contents());
)
private function __construct() {
}
/**
* 實例化
*/
public static function getInstance() {
//判斷是否被實例化
if(!(self::$_instance instanceof self)) {
self::$_instance = new self();
}
return self::$_instance;
}
/**
* 數據庫連接
*/
public function connect() {
if(!self::$_connectSource) {
//數據庫連接
// @ 符號可以取消警告提示
self::$_connectSource = @mysql_connect($this->_dbConfig['host'],$this->_dbConfig['user'],$this->_dbConfig['password']);
if(!self::$_connectSource) {
//拋出異常處理
throw new Exception('mysql connect error ');
}
//選擇一款數據庫
mysql_select_db($this->_dbConfig['database'], self::$_connectSource);
//設置字符編碼
mysql_query("set names UTF8", self::$_connectSource);
}
//返回資源鏈接
return self::$_connectSource;
}
}
?>
先來看看PHP在服務器的執行過程:當用戶請求服務器php文件的時候,服務器將對php文件進行語法分析,其次是解析,最后才運行。當php文件有內容輸出時,該內容會先經過服務器的php的緩沖區(buffer),然后再通過TCP傳遞到客戶端。(buffer其實就是緩沖區,一個內存地址空間,主要用於存儲數據區域)
可見,如果用戶直接訪問靜態頁面的時候,服務器的響應時間一般會比訪問動態文件的時間短。如果我們能把用戶將要訪問的動態文件先轉化為靜態文件即可加快用戶訪問頁面的速度(獲取網頁的速度)。當然我們要注意靜態化的應用場景,頁面的靜態化主要應用於那些頁面內容不經常改動的頁面。
關於靜態化,PHP的靜態化分為:純靜態和偽靜態。其中純靜態又分為:局部純靜態和全部純靜態。這里將的是全部純靜態。
這里先介紹幾個關於PHP緩沖區的相關函數:
ob_start 打開輸出控制緩沖(要求php開啟緩存,在php配置文件php.ini文件中可以設置 output_buffering = on)
ob_get_contents 返回輸出緩沖區內容
ob_clean 清空(擦掉)輸出緩沖區
ob_get_clean 得到當前緩沖區的內容並刪除當前輸出緩沖區
php生成文件的函數 file_put_contents('文件路徑','文件內容')。(當然php中還有其他寫文件的方法,如fwrite)
下面有個demo01的案例,目錄結構為:

我們先來創建一個 mooc_cms 數據庫,創建表 news,如下:

並且插入多條數據,如下:

創建一個數據庫的操作類 db.php
- <?php
-
-
-
- class Db {
-
- private static $_instance;
-
- private static $_connectSource;
-
- private $_dbConfig = array(
- 'host' => '127.0.0.1',
- 'user' => 'root',
- 'password' => '',
- 'database' => 'mooc_cms'
- );
-
- private function __construct() {
-
- }
-
-
-
-
- public static function getInstance() {
-
- if(!(self::$_instance instanceof self)) {
- self::$_instance = new self();
- }
- return self::$_instance;
- }
-
-
-
-
- public function connect() {
- if(!self::$_connectSource) {
-
-
- self::$_connectSource = @mysql_connect($this->_dbConfig['host'],$this->_dbConfig['user'],$this->_dbConfig['password']);
-
- if(!self::$_connectSource) {
-
- throw new Exception('mysql connect error ');
- }
-
- mysql_select_db($this->_dbConfig['database'], self::$_connectSource);
-
- mysql_query("set names UTF8", self::$_connectSource);
- }
-
-
- return self::$_connectSource;
- }
- }
- ?>
index.php (根據靜態文件失效的時間,判斷是否重新生成靜態文件 index.shtml)
- <?php
-
-
-
- if(is_file('index.shtml') && (time() - filemtime('index.shtml')) < 300) {
- require_once('index.shtml');
- } else {
- require_once('db.php');
-
- $connect = Db::getInstance()->connect();
- $sql = "SELECT * FROM news WHERE `category_id` = 1 AND `status` = 1 ORDER BY id DESC LIMIT 5";
- $result = mysql_query($sql, $connect);
- $news = array();
- while($row = mysql_fetch_array($result)) {
- $news[] = $row;
- }
-
-
- ob_start();
-
-
- require_once('templates/singwa.php');
- file_put_contents('index.shtml', ob_get_contents());
-
-
-
-
-
- }
-
- ?>
singwa.php(使用bootstrap框架做界面)
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>新聞中心</title>
- <link rel="stylesheet" href="public/css/bootstrap.min.css" type="text/css">
- </head>
- <body>
- <div class="container">
- <h3>新聞列表</h3>
- <ul class="list-group">
- <?php foreach ($news as $key => $value) { ?>
- <li class="list-group-item"><a href="#"><?php echo $value['title'];?></a></li>
- <?php } ?>
- </ul>
- </div>
- </body>
- </html>
當我們第一次訪問 index.php時,服務器將為我們生成一個靜態文件index.shtml。

出現 index.shtml文件:

index.shtml
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>新聞中心</title>
- <link rel="stylesheet" href="public/css/bootstrap.min.css" type="text/css">
- </head>
- <body>
- <div class="container">
- <h3>新聞列表</h3>
- <ul class="list-group">
- <li class="list-group-item"><a href="#">今天有一條新聞7</a></li>
- <li class="list-group-item"><a href="#">今天有一條新聞6</a></li>
- <li class="list-group-item"><a href="#">今天有一條新聞5</a></li>
- <li class="list-group-item"><a href="#">今天有一條新聞4</a></li>
- <li class="list-group-item"><a href="#">今天有一條新聞3</a></li>
- </ul>
- </div>
- </body>
- </html>
當我們不超過300秒,再次訪問index.php時,服務器將訪問靜態文件index.shtml給我們訪問。而當靜態文件過期后,我們再次訪問index.php,服務器將為我們更新index.shtml靜態文件。
這里講到的只是一種觸發靜態文件更新的方法,當然還有:手動觸發更新(設置后台管理,管理員想立即更新靜態文件,就點擊運行生成靜態文件即可)、Linux服務器下的crontab定時掃描程序(在linux服務器下,設置命令:
* /1 * * * * php 路徑+文件名 ==> 代表 每一分鍾系統將執行一次指定文件

文件內容可以為:
- require_once('db.php');
-
- $connect = Db::getInstance()->connect();
- $sql = "SELECT * FROM news WHERE `category_id` = 1 AND `status` = 1 ORDER BY id DESC LIMIT 5";
- $result = mysql_query($sql, $connect);
- $news = array();
- while($row = mysql_fetch_array($result)) {
- $news[] = $row;
- }
-
-
- ob_start();
-
-
- require_once('templates/singwa.php');
- file_put_contents('index.shtml', ob_get_contents());
)