一、頁面靜態化
1、頁面靜態化介紹
說明:
頁面靜態化,就是將PHP查詢的結果保存到一個靜態的html文件中,將來用戶訪問的時候,直接訪問該靜態html文件即可
相對於頁面緩存的比較:
緩存減輕了數據庫的壓力,但是服務器(php)壓力依然存在

頁面靜態化之后:減輕了服務器、數據庫的壓力

使用頁面靜態化:
查詢比較頻繁、不經常更新的內容,可以使用頁面靜態化,例如:新聞、文章
但是數據經常變化的:評論、天氣情況、股票等,就不適合使用頁面靜態化
頁面靜態化使用什么技術實現呢?
就使用ob緩沖、結合file_put_contents函數實現
2、ob緩沖介紹
ob緩沖是服務器向客戶端響應數據時,存儲響應數據的臨時空間,
服務器在向客戶端推送數據之前,不是一次性把所有的數據都給客戶端,而是先push到ob緩沖區域,再一點一點給客戶端,減輕服務器的壓力。

開啟ob緩沖
在php.ini配置文件中,找到output buferring

ob緩沖相關函數
ob_start() 開辟一塊新的緩沖區域
只要ob_start()一次,就會在PHP的緩存中開辟一塊緩沖區域
而且,服務器輸出的內容會先輸出到緩沖區域,再給客戶端響應
ob_get_contents() 獲取緩沖區域里面的內容
ob_get_length() 獲取緩沖區域內容的長度
ob_flush() 將緩沖區域的內容直接刷出\輸出
ob_get_flush() 獲得緩沖區域刷出的內容
ob_clean():清空緩沖區域的內容
ob_get_clean():獲得清空的緩沖區域的內容
ob緩沖處理器
說明:
ob緩沖處理器,就是在輸出緩沖區域的內容之前,使用某個函數進行處理
通常我們會使用ob_gzhandler處理器進行壓縮處理

ob多緩沖
說明:
我們可以在PHP里面開啟多塊緩沖區域,每ob_start()一次,就會在PHP里面創建一塊緩沖區域,而且,將來ob_clean清空緩沖區域時,操作的是離開啟緩沖最近那個緩沖區域

2、ob緩沖實現頁面靜態化
說明:
服務器響應給客戶端的數據,會先輸出到緩沖區域
服務器向客戶端響應數據的方式:echo、var_dump、require、include

兩步生產靜態html
(1)先將require_once加載的模板內容,保存到緩沖區域,再讀取並輸出到靜態html文件

(2)使用file_put_contents函數生成html文件

注意:使用smarty是可通過fetch方法獲取$content (smarty封裝了ob緩沖)
$content = $smarry->fetch('xxx.html')
二、偽靜態
1、偽靜態介紹
說明:
頁面靜態化是真靜態,因為生產靜態的html文件,所謂的偽靜態是假的靜態,偽靜態的效果是這個樣子:http://localhost/app/xxxcontroller/add
訪問的時候,會進入控制器的add方法中,但是給用戶的感覺是靜態頁面,實際上還是會動態解析即 index.php?c=xxxcontroller&a=addAction
,所以稱之為偽靜態。
偽靜態的優點
(1) url地址簡潔,方便用戶記憶
(2) 對SEO(搜索引擎優化)(注:搜索引擎包括:百度、360搜索、搜狗、谷歌),比較友好
index.php?m=home&c=question&a=indexAction,會根據參數的不同進入到不同的頁面(日歷:y=2019&m=12&d=22),擔心頁面沒有窮盡,當然現在搜索引擎技術不斷進步(對動態網站內容專區也會越來越好)
使用偽靜態的地址:question/index.html,看到網頁的時候,認為你是靜態的網頁,多抓取。因此便於搜索引擎收錄。
2、偽靜態實現
(1) 借助PHP超全局數組變量:$_SERVER[‘PATH_INFO’]獲得路徑的信息,如果index.php后面有路徑信息則返回,如果index.php后面沒有路徑信息,則提示未定義

(2)根據index.php后面的路徑的信息,解析出對應的$_GET[‘m’]、$_GET[‘c’]、$_GET[‘a’]
偽靜態地址基本類型:
情況1:admin
解析到后台,進入到默認的控制器、默認方法中
情況2:admin/question
解析到后台模塊的question控制器,默認的動作
情況3:admin/question/add
解析到后台、question控制器的add方法
情況4:admin/question/delete/id/2
解析到后台、question控制器、delete方法,額外參數是id=2
解析規則:
先把.html、.htm 這樣的字符替換掉
字符串分割:explode()炸開,獲得數組
根據炸開之后的數組的元素個數進行分類。

3、隱藏入口文件
說明:
有的網站不想讓用戶看到網站采用什么語言開發、其次想讓url地址更加簡潔,所以通常直接訪問網站,不需要攜帶index.php。
實現:
(1)直接通過修改apache的配置文件實現,當訪問的url地址指向的不是一個文件、不是一個目錄的時候,將該url地址信息作為index.php后面的PATH_INFO進行處理。
(2)apache提供了一個分布式配置文件(.htaccess),分布式配置文件,只針對當前項目有效,對其他項目沒有影響,而且不用重啟apache服務器。
步驟:
步驟1:首先要在apache的配置文件中,開啟重寫模式(也就是允許使用分布式配置系統)


步驟2:在項目根目錄創建.htaccess文件
<IfModule rewrite_module>
#開啟重寫引擎
RewriteEngine on
#重寫的條件(訪問的url地址指向的不是文件、不是目錄的時候,采用重寫機制)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
#重寫規則
RewriteRule (.*) index.php/$1
</IfModule>
#當訪問的是一個目錄時,會將如下文件作為默認的歡迎頁面,會先顯示index.html,如果沒有則顯示index.php
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
