php的ob函數實現頁面靜態化(php ob函數)

  • 1、php如何實現網頁靜態
  • 2、php ob首頁靜態化
  • 3、如何用PHP輸出靜態頁面
  • 4、如何用PHP輸出靜態頁面?
  • 5、大型php網站全站靜態化怎麼實現? 如果有上萬個頁面每更改一小篇文章都要全部重新生成嗎?

一、靜態化的優點:

1有利於搜索引擎收錄網站頁面的信息:搜索引擎更喜歡靜態的,更變於抓取,搜索引擎SEO排名會更容易提高。

2靜態網頁化網頁穩定

3可以提高網頁載入速度

4減輕伺服器負擔,瀏覽器不需要頻發調用資料庫。

5資料庫出錯不會影響正常訪問

二、偽靜態

PHP偽靜態:是利用Apache mod_rewite實現url重寫的方法

改寫訪問地址,能夠通過URL的PATHINFO模式來改動它。讓它看上去更像一個靜態頁面。從而有更大的幾率被搜索引擎抓取和收錄,僅是對搜索引擎比較友好,偽靜態化

三、純靜態化

純靜態化,就是生成HTML文件的方式,我們須要開啟PHP自帶的緩存機制,即ob_start來開啟緩存。而且在ob_start之前不能有不論什麼輸出,否則運行失敗,然後我們用ob_get_contents函數來獲取緩存中的內容,該函數會返回一個字元串。第三個函數就是ob_end_clean,它用來清空緩存中的內容而且關閉,成功返回True,失敗返回False。

?php

if(file_exists(“match.html”) (time()-filemtime(“match.html”))300)

{

//如果存在對應的靜態文件,則直接訪問

require_once(“match.html”);

}else{

//這裡用數組來模擬資料庫操作,現實一般都是操作資料庫得到對應數據

$student = array(“huangxing”,”chenyuwei”,’xufei’,’zhangjingwen’,’xuepei’);

ob_start();

//載入模板

require_once(“muban.php”);

file_put_contents(“match.html”,ob_get_clean());

require_once(‘match.html’);

}

ob_start(); //啟動輸出緩存

//do something

$cache = ob_get_clean(); //取得自啟動以來的輸出緩存並刪除緩存

file_put_contents(‘index.html’, $cache); //將緩存的內容寫入到文件中

訪問index.html就可以輸出上述代碼本該輸出的內容了~~~~

而要加個控制是否生成緩存,只需要弄個變數做個標記即可~~~

$staticStatus = true;

ob_start();

//do something

$cache = ob_get_content();

ob_clean(); //兩個合起來的功能跟ob_get_clean一樣

if($staticStatus)

{

    file_put_contents(‘index.html’, $cache);

}

用PHP輸出靜態頁面有2種方法

一種是利用模板技術,另一種是用ob系列函數。兩種方法,看起來都差不多,但是實際上,卻是不同的。

第一種:利用模板

目前PHP的模板可以說是很多了,有功能強大的smarty,還有簡單易用的smart template等。

它們每一種模板,都有一個獲取輸出內容的函數。

我們生成靜態頁面的方法,就是利用了這個函數。

用這個方法的優點是,代碼比較清晰,可讀性好。

這裡我用smarty做例子,說明如何生成靜態頁

?php

require(‘smarty/Smarty.class.php’);

$t = new Smarty;

$t-assign(“title”,”Hello World!”);

$content = $t-fetch(“templates/index.htm”);

//這裡的 fetch() 就是獲取輸出內容的函數,現在$content變數裡面,就是要顯示的內容了

$fp = fopen(“archives/2005/05/19/0001.html”, “w”);

fwrite($fp, $content);

fclose($fp);

?

第二種方法:利用ob系列的函數

這裡用到的函數主要是 ob_start(), ob_end_flush(), ob_get_content(),

其中ob_start()是打開瀏覽器緩衝區的意思,

打開緩衝後,所有來自PHP程序的非文件頭信息均不會發送,

而是保存在內部緩衝區,直到你使用了ob_end_flush().

而這裡最重要的一個函數,就是ob_get_contents(),

這個函數的作用是獲取緩衝區的內容,相當於上面的那個fetch(),

道理一樣的。代碼:

?php

ob_start();

echo “Hello World!”;

$content = ob_get_contents();//取得php頁面輸出的全部內容

$fp = fopen(“0001.html”, “w”);

fwrite($fp, $content);

fclose($fp);

?

一種是利用模板技術,另一種是用ob系列函數。兩種方法,看起來都差不多,但是實際上,卻是不同的。

第一種:利用模板目前PHP的模板可以說是很多了,有功能強大的smarty,還有簡單易用的smart

template等。

它們每一種模板,都有一個獲取輸出內容的函數。

我們生成靜態頁面的方法,就是利用了這個函數。

用這個方法的優點是,代碼比較清晰,可讀性好。

$t

=

new

Smarty;

$t-assign(“title”,”Hello

World!”);

$content

=

$t-fetch(“templates/index.htm”);

//這裡的

fetch()

就是獲取輸出內容的函數,現在$content變數裡面,就是要顯示的內容了

$fp

=

fopen(“archives/2005/05/19/0001.html”,

“w”);

fwrite($fp,

$content);

fclose($fp);?第二種方法:利用ob系列的函數這裡用到的函數主要是

ob_start(),

ob_end_flush(),

ob_get_content(),

其中ob_start()是打開瀏覽器緩衝區的意思,

打開緩衝後,所有來自PHP程序的非文件頭信息均不會發送,

而是保存在內部緩衝區,直到你使用了ob_end_flush().

而這裡最重要的一個函數,就是ob_get_contents(),

這個函數的作用是獲取緩衝區的內容,相當於上面的那個fetch(),

道理一樣的。代碼:

用libTemplate實現靜態網頁的生成

作者:iwind

原來在dev-club發表的一篇文章,將怎麼用模板處理程序PHPlib 中的template.inc實現靜態網頁的生成,呵呵,居然被列入精華,並被多個網站轉載,想來這是榮幸。其實網上這方面的東西很多了,我上此發布的所謂IAMS( iwind 文章管理系統),裡面也有,有心人可以看一下。下面我只是簡要在總結一次。

現在一般說生成靜態網頁的方法有三種,一個是配置伺服器,大家可以到 去找找看,對於這個很多地方都有的。另外一個是用ob_函數控制輸出。方法如下:先用ob_start();打開輸出緩衝器,然後是對數據的分析,操作等等,跟著用ob_get_contents();獲取緩衝區的內容,然後再寫入文件。根據這個步驟,可以寫出以下程序:

?php

ob_start();

//主體部分,數據操作,處理,輸出等等。。。

require」global.php」;

mysql_connect(「localhost」,」root」,」」);

…..

//獲取緩衝區內容

$contents=ob_get_contents();

//如果不想輸出任何東西,可以加上這句

ob_end_clean();

//寫入目的文件

$fp=@fopen($targetFile,」w+」) or die(「打開文件時出錯」);

fwrite($fp,$contents);

?

這樣就把這個動態頁面的內容寫入了靜態頁面,$targetFile.像有的網站首頁內容很多,要調用n多個查詢語句時,不妨定時生成靜態網頁,既大幅提高了訪問速度,也減輕了伺服器負擔。

你可以看出來,我用ob_只是處理單個頁面,對於批量寫入或更新多個頁面,這個方法就不行了。這就是我要講的第三種方法,用模板。模板是個好東東,現在大家都或多或少在用它,建議還不會簡單模板處理的網友,花點時間去學它,一般的模板處理程序都很簡單的。用模板實現靜態網頁的生成是非常簡單的,方法就是獲取分析結果,把分析結果寫入文件。下面就以PHPlib中的template.inc來談談如果用模板生成靜態網頁。

一, 修改template.inc

加入以下的幾個函數:

//將分析結果保存到文件中去

function savetofile ($dir,$varname){

$data=$this- finish($this- get_var($varname));

$fp=fopen($dir, “w+ “);

fwrite($fp,$data);

}

//清除已賦值數組

function renew(){

$this- varkeys=array();

$this- varvals=array();

$this- file=array();

}

第一個函數是結果保存到靜態文件中,第二個是把所有的模板分析變數都置為空,以免批量處理時相互影響。

二,實現靜態網頁生成。

?php

$itpl- set_file(「main」,」mian.tpl」);

//分析模板變數

…..

//分析main?mains

$tpl- parse( “mains “, “main “);

//把分析結果mains存入main.html

$tpl- savetofile( “main.html “, “mains “);

//置空

$tpl- renew();//至關重要

?

呵呵,是不是很簡單,main.html就是我們要的內容。下面是一個結合資料庫的例子,並用函數封裝了起來。

?php

//$aid是資料庫中的文章id,$table是表名稱,$template是模板地址,$tpl是template.inc的一個實例

//每一個aid對應一個靜態網頁地址,都存在一個數據表中

//表的結構類似於 aid target title

// 1 a1.html ….

// 2 a2.html ….

// 3 a3.html ….

function staticInfo($aid){

global $table,$template,$tpl;

//查詢資料庫

$res=mysql_query(「select * from $table where aid=』$aid』」);

//取出數據

$array=mysql_fetch_array($res);

//讀靜態網頁地址,標題。

$target=$array[「target」];

$title=$array[「title」];

//分析模板

$tpl- set_file(「main」,$template);

//把模板中的{title}變數換成$title

$itpl- set_var(「title」,$title」);

//分析整個模板

$itpl- set_var(「mains」,」main」);

//把mains寫入文件

$tpl- savetofile($target, “mains “);

//置空

$tpl- renew();

}

?

這樣我們就可以用函數staticInfo()把我們想要處理的任一篇文章都生成靜態網頁。表$target里也可以包含文章內容,作者,來源等等,方法是一樣的。

三,更新靜態網頁

一篇文章加入資料庫後,由於一些原因我們總要修改一些文章。這時候,只要把相應的靜態網頁重新生成一次即可。這是非常方便的,因為表中已經有了靜態網頁的目標地址target欄位。

可以看出關鍵所在,一篇文章生成靜態網頁的關鍵所在就是$template(模板地址),$target(目標地址)。前者,我們可以先確定,後者可以由你隨心所欲的為每篇文章設置一個地址。常用的有1,時間戳 2,時分秒 3,根據文章id。因為這些重複的機會會非常小的。

四,批量生成靜態網頁.

有了單個文章生成的靜態網頁的函數了,那麼批量生成是非常簡單的。就是獲取所有的文章aid,然後套入函數即可。

?php

//引用模板類

require」template.inc」;

//引入函數

require」functions.php」;

//一些變數的定義

$table=」art」;

$template=」template/info.tpl」;

$tpl=new Template(「.」);

//連接mysql,選擇資料庫

mysql_connect(「localhost」,」root』,」」);

mysql_select_db(「article」);

//發送查詢語句

$res=mysql_query(「select aid from $table」);

while($r=mysql_fetch_array($res)){

$aid=$r[「aid」];

//生成靜態網頁

staticInfo($aid);

}

//結束

echo」所有靜態網頁更新/生成成功」;

?

上面就是完整的例子。我們做cms的流程可以如下:

1,記者發稿(把稿件內容放入資料庫)

2,編輯審查(如果他認為可以發布,那麼就可以把這些內容生成靜態網頁)

3,退回稿件(把生成的靜態網頁刪除,把資料庫中的內容刪除)

然後,我們訪問到的網站內容就都是靜態的了。一個問題就是,這種方法會不會佔用很多空間內? 有上千篇文章了,只佔用了20M空間。反過來說,如果你有10000篇文章的話,你不會吝嗇到只買200M的空間吧?

或許你對生成靜態的文章列表感到困惑,其實方法是一樣的,就是 計算頁碼? 分析每個頁碼的內容 ? 寫入文件。 分析每個頁碼的內容,當然是寫個函數咯,如果你一頁一頁的生成,恐怕被人嘲笑 ^_^。

靜態網頁不僅僅是可以減輕伺服器負擔,提高訪問速度,也可以方便地做鏡像網站,方便地備份,減少被攻擊損失程度,加快還原速度。當然靜態網頁也會給大家帶來諸多不便的地方,你需要在動態和靜態之間做出平衡,

也可以在靜態網頁中加入js調用的php代碼,來達到計數,即時更新等目的。(完)

原創文章,作者:HE56S,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/127202.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
HE56S的頭像HE56S
上一篇 2024-10-03 23:13
下一篇 2024-10-03 23:13

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29

發表回復

登錄後才能評論