PHP實現頁面靜態化

概念

PHP靜態化分為:純靜態化 和 偽靜態化;純靜態化又分為:局部靜態化 和 完全靜態化

純靜態化:是把PHP生成的動態頁面保存成靜態的html文件,用戶訪問該靜態頁面,而不是用戶每一次訪問都重新生成一張相同的網頁,優點就是減小服務器開銷,

局部靜態化:是生成的靜態文件中,有局部的數據還是通過ajax技術動態獲取的;

完全靜態化:即不存在動態獲取數據的情況,所以內容都來自靜態的html頁面

偽靜態化:其實還是動態訪問,其實質是動態生成數據,你訪問的網址類似于"http://yourhost,com/index/post/12",是一個靜態地址,該地址多見于博客地址,但偽靜態化中,你訪問的網址實際上經過服務器解析,還是會解析成類似于"http://yourhost,com/?c=index&a=post&id=12"的地址,所以稱之為偽靜態化

偽靜態的優點:美觀;便于搜索引擎收錄

純靜態化的實現

利用php內置的ob函數實現頁面的靜態化,大概步驟如下:

<?php ob_start();//開啟緩存 
?>

<p>我是要生成的靜態內容,也可以在該處鏈接數據庫生成動態內容于此</p>
<?php 
file_put_contents( 'index.html', ob_get_clean() );//把生成的靜態內容保存到index.html文件,而不是輸出到瀏覽器

?>

觸發系統生成純靜態化頁面

方法:頁面添加緩存時間;手動觸發

1、頁面添加緩存時間

<?php
$file_name = 'index.html';
if(file_exists( $file_name ) &&  filemtime( $file_name ) - time() < 10 ){//如果文件是存在并且最后修改時間小于設定時間 10s
    //filemtime( $file_name );//得到文件最后修改時間
    //time();//當前時間
    require_once( $file_name );//引入文件
}else{
 ob_start( );
 ?>
<p>我是要生成的靜態內容</p>
 <?php
file_put_contents( $file_name,  ob_get_contents() )//輸出到瀏覽器
}

1、手動觸發

如果后臺數據存在更新,定時刷新不能及時更改靜態頁面,怎么辦?可以引入了手動觸發的功能,可以通過后臺管理系統,手動更新。

除此之外還有Linux下的crontab定時任務

*/5****php/data/static/index.php

局部靜態化

一般通過ajax來動態刷新頁面中部分需要實時更新的數據

偽靜態

PHP偽靜態

// 靜態:http://yourhost.com/index.php/12/2.html
// 動態:http://yourhost.com/index.php?type=12&id=2
$pathinfo = $_SERVER['PATH_INFO'];
if( preg_match('/^\/(\d+)\/(\d+)/', $pathinfo,$path) ){
    $type = $path[1];
    $id = $path[2];
    echo 'type=',$type,'&id=',$id;//獲得type 和 id 進一步處理
}else{
    //錯誤處理
    echo "err";
}

Apache服務器rewrite配置

在httpd.conf文件中,找到

#注釋:去掉前邊的" # "開啟rewrite服務,重啟服務器生效
#LoadModule rewrite_module modules/mod_rewrite.so

#注釋:http-vhosts.conf文件是虛擬域名配置的文件,開啟改文件可以配置虛擬域名,一般默認是開啟的
#Include conf/extra/httpd-vhosts.conf 

rewrite偽靜態配置


<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "c:/Apache24/docs/dummy-host.example.com"
    ServerName dummy-host.example.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "logs/dummy-host.example.com-error.log"
    CustomLog "logs/dummy-host.example.com-access.log" common

    #完整的配置規則如下
    RewriteEngine on
    #添加以下兩項,!-d  和  !-f  分別表示  目錄 和 文件
    #當訪問的偽靜態和相應的靜態目錄和文件沖突時,訪問靜態頁面
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
    RewriteRule ^/index/([0-9]*).html$ /index.php?id=$1
    
</VirtualHost>



參考網站:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,377評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,949評論 18 139
  • 【離開,在黎明】 一座座村落,一片片倒下的莊稼桿 那株漏網的野菊,站在秋風里巴巴的望著我 冬耕的泥土上,我還沒來及...
    蝸汼閱讀 897評論 0 1
  • 網約車即將規范化,相關條約已經出爐,對于戶籍,車齡,車價,以及司機的政治面貌,有無犯罪記錄等等,很多方面都提出了條...
    圓圓的湘氣閱讀 298評論 1 1