1. 程式人生 > >php實現頁面靜態化(純靜態&&偽靜態)

php實現頁面靜態化(純靜態&&偽靜態)

1、開啟buffer

•在php.ini中的output_buffering開啟
•在php檔案中應用ob_start()函式開啟

; Default Value: Off ; Development Value: 4096 ; Production Value: 4096 ; output_buffering = 4096

2、獲取緩衝區的內容

output_buffering=on 需要先開起,才幹呼叫ob_get_contents()函式。但是,如果不開啟output_buffering時,當在標頭檔案中呼叫函式ob_start()函式時,ob_get_contents()也能應用。

ob_get_content();//返回輸出緩衝區的內容;

PHP如何實現頁面純靜態化

基本方式

1、file_put_contents

2、應用PHP內建快取機制實現頁面靜態化output_buffering

ob_start()//如果php.ini已經開啟,那麼這裡會開啟一個新的輸出緩衝區; ob_get_contents()//獲取輸出緩衝區內容; ob_clean()//清空輸出緩衝區內容,但是不會刪除輸出緩衝區 ob_get_clean//獲取輸出緩衝區內容並且刪除輸出緩衝區,等價於ob_get_contents和ob_end_clean)

下方這段程式碼,執行是不會有輸出的

原因就是輸出緩衝區被清空了,看上圖理解

ob_start(); echo 777; echo 000; ob_clean(); echo ob_get_contents();

純靜態實現,程式碼和實現邏輯參考:

<?php /** * 觸發系統生成純靜態化頁面業務邏輯 * 有3種方案: * 第一:定時掃描程式(利用crontab來處理) * 第二:手動觸發方式,人為觸發 * 第三:頁面新增快取光陰,在頁面中把持光陰來操作 */ //=========================================== //生成純靜態檔案步驟 //1、連線資料庫,然後從資料庫裡面獲取資料 //2、把獲取到的資料填充到模版檔案裡面 //3、需要把動態的頁面轉為靜態頁面,生成靜態化檔案 //============================================ //PHP實現頁面靜態化有以下步驟: //1:A.php請求資料庫資料:通過mysql或者mysqli或者PDO擴充套件 //2:在A.html中輸出A.php請求的資料庫資料:一般是將將在資料庫中取出的陣列形式的資料賦予新的陣列,並且輸出 //3:在A.php中包孕A.html檔案:直接通過require_once()函式或者inclde_once() //4:開啟資料快取ob_start()=>獲取獲取快取內容並且將資料生成在靜態檔案中file_put_contents('index.shtml',ob_get_clean()); //header("content-type:text/htm;charset=utf-8"); if(is_file('./index.html') && (time() - filemtime('./index.html') < 1200)) { //快取未失效則直接載入靜態檔案 require_once('./index.html'); } else { //快取失效了則重新生成 // 引入資料庫

連結操作 require_once('./db.php'); $sql = "select * from news where `category_id` = 1 and `status` = 1 limit 4"; try { $db = Db::getInstance()->connect(); $result = mysql_query($sql, $db); $newsList = array(); while($row = mysql_fetch_assoc($result)) { $newsList[] = $row; } } catch(Exception $e) { // TODO } ob_start(); require_once('template/index.php');//引入模版檔案 file_put_contents('./index.html', ob_get_contents());//生成靜態檔案 //ob_clean(); }

靜態頁面中區域性動態化實現

利用Jquery中的ajax請求檔案,獲取到返回的JSON資料,然後使用到模版就可以了

偽靜態

Nginx伺服器預設不支援PATH INFO模式,需要額外配置

Apache偽靜態設定

1、開啟apache mod_rewrite.so 配置 在 httpd.conf中。

測試的話可以用phpinfo檢視,看是否loaded modules 有這個模組

2、inculde conf/extra/httpd-vhosts.conf virtual hosts支援,虛擬域名配置

3、編輯vartual host 檔案

4、本機host檔案加入配置的域名(如果需要本機測試針對windows)

5、偽靜態配置

- 5.1 rewrite engine on 
- 5.2編寫規則

^/post/([0-9]*).html$ /post.php?id=$1

放在 virtualhost 段中 

post.php 中編寫

<?php echo 'this is '.$_GET['id'];

然後可以造訪a.com/123.html 返回的就是this is 123.

擴充套件:如果目錄下有123.html這個真正的檔案,那麼還是載入了動態的post 123. 
那麼如何設定呢,想要當前檔案有了真正的靜態檔案,那麼需要以下配置了

RewriteEngine on RewriteRule ^/post/([0-9]*).html$ /post.php?id=$1 #存在目錄 RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}!-d #存在檔案 RewriteCond%{DOCUMENT_ROOT}%{REQUEST_FILENAME}}!-f

以上兩句話意思是如果根目錄下有請求的目錄或者檔案,那就用他

當然這個要放在剛剛的那個rewrite的上面。

Nginx偽靜態