當前位置:首頁 » 編程語言 » php模板原理

php模板原理

發布時間: 2023-08-25 05:12:09

1. php技術生成靜態頁面的實現


我們先回顧一些基本的概念。
一、PHP腳本與動態頁面。
PHP腳本是一種伺服器端腳吵旅扒本程序,可通過嵌入等方法與HTML文件混合,也可以類,函數封裝等形式,以模板的方式對用戶請求進行處理。無論以何種方式,它的基本原理是這樣的。由客戶端提出請求,請求某一頁面-----Web伺服器引入指定相應腳本進行處理-----腳本被載入伺服器-----由伺服器指定的PHP解析器對腳本進行解析形成HTML語言形式----將解析後的HTML語句以包的方式傳回給瀏覽器。由此不難看出,在頁面發送到瀏覽器後, PHP就不存在了,已被轉化解析為HTML語句。客戶請求為一動態文件,事實上並沒有真正的文件存在在那裡,是PHP解析而成相升昌對應的頁面,然後發送回瀏覽器。這種頁面處理方式被稱為「動態頁面」。
二、靜態頁面。
靜態頁面是指在伺服器端確實存在的僅含HTML以及JS,CSS等客戶端運行腳本的頁面。它的處理方式是。由客戶端提出請求,請求某一頁面- ---
WEB伺服器確認並載入某一頁面----WEB伺服器將該頁面以包的形式傳遞回瀏覽器。由這一過程,我們對比一下動態頁面,即可方現。動態頁面需由Web伺服器的PHP解析器進行解析,而且通常還需連接資料庫,進行資料庫存取操作,然後才能形成HTML語言信息鎮知包;而靜態頁面,無須解析,無須連接資料庫,直接發送,可大大減輕伺服器壓力,提高伺服器負載能力,大幅提供頁面打開速度和網站整體打開速度。但其缺點是,不能動態地對請求進行處理,伺服器上必須確實存在該文件。
三、模板及模板解析。
模板即尚未填充內容html文件。例如:
temp.html
Code:
以下是引用片段:
HTML
TITLE{ title }/TITLE
BODY
this is a { file } file''''s templets
/BODY
/HTML
PHP處理:
以下是引用片段:
templetest.php
Code:
$title = "HP愛好者測試模板";
$file = "TwoMax Inter test templet,
author:Sheyi";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file }",$file,$content);
$content .= str_replace ("{ title }",$title,$content);
echo $content;
?
模板解析處理,即將經PHP腳本解析處理後得出的結果填充(content)進模板的處理過程。通常藉助於模板類。目前較流行的模板解析類有 phplib,smarty,fastsmarty等等。模板解析處理的原理通常為替換。也有些程序員習慣將判斷,循環等處理放進模板文件中,用解析類處理,典型應用為block概念,簡單來說即為一個循環處理。由PHP腳本指定循環次數,如何循環代入等,再由模板解析類具體實施這些操作。
好了,對比過靜態頁面與動態頁面各自的優劣,現在我們就來說說,如何用PHP生成靜態文件。
PHP生成靜態頁面並不是指PHP的動態解析,輸出HTML頁面,而是指用PHP創建HTML頁面。同時因為HTML的不可寫性,我們創建的 HTML 若有修改,則需刪掉重新生成即可。(當然你也可以選擇用正則進行修改,但個人認為那樣做倒不如刪掉重新生成來得快捷,有些得不償失。)
言歸正傳。用過PHP文件操作函數的PHP FANS知道,PHP中有一個文件操作函數fopen,即打開文件。若文件不存在,則嘗試創建。這即是PHP可以用來創建HTML文件的理論基礎。只要用來存放HTML文件的文件夾有寫許可權(即許可權定義0777),即可創建文件。(針對UNIX系統而言,Win系統無須考慮。)仍以上例為例,若我們修改最後一句,並指定在test目錄下生成一個名為test.html的靜態文件:
Code:
以下是引用片段:
$title = "拓邁國際測試模板";
$file = "TwoMax Inter test templet,
author:_Max"Matrix@Two_Max";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file }",$file,$content);
$content .= str_replace ("{ title }",$title,$content);
// echo $content;
$filename = "test/test.html";
$handle = fopen ($filename,"w"); //打開文件指針,創建文件
/*
檢查文件是否被創建且可寫
*/
if (!is_writable ($filename)){
die ("文件:".$filename."不可寫,請檢查其屬性後重試!");
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
die ("生成文件".$filename."失敗!");
}
fclose ($handle); //關閉指針
die ("創建文件".$filename."成功!");
?
實際應用中常見問題解決方案參考:
一、文章列表問題:
在資料庫中創建欄位,記錄文件名,每生成一個文件,將自動生成的文件名存入資料庫,對於推薦文章,只需指向存放靜態文件的指定文件夾中的該頁面即可。利用PHP操作處理文章列表,存為字元串,生成頁面時替換此字元串即可。如,在頁面中放置文章列表的表格加入標記{ articletable },而在PHP處理文件中:
Code:
以下是引用片段:
$title = "拓邁國際測試模板";
$file = "TwoMax Inter test templet,
author:_Max"Matrix@Two_Max";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file }",$file,$content);
$content .= str_replace ("{ title }",$title,$content);
// 生成列表開始
$list = ''''''''
$sql = "select id,title,filename from article";
$query = mysql_query ($sql);
while ($result = mysql_fetch_array ($query)){
$list .= ''''''''.$result[''''title''''].''''
''''
}
$content .= str_replace ("{ articletable }",$list,$content);
//生成列表結束
// echo $content;
$filename = "test/test.html";
$handle = fopen ($filename,"w"); //打開文件指針,創建文件
/*
檢查文件是否被創建且可寫
*/
if (!is_writable ($filename)){
die ("文件:".$filename."不可寫,請檢查其屬性後重試!");
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
die ("生成文件".$filename."失敗!");
}
fclose ($handle); //關閉指針
die ("創建文件".$filename."成功!");
?
二、分頁問題。
如我們指定分頁時,每頁20篇。某子頻道列表內文章經資料庫查詢為45條,則,首先我們通過查詢得到如下參數:1,總頁數;2,每頁篇數。第二步, for ($i = 0; $i
allpages; $i++),頁面元素獲取,分析,文章生成,都在此循環中執行。不同的是,die ("創建文件".$filename."成功!";這句去掉,放到循環後的顯示,因為該語句將中止程序執行。例:
Code:
以下是引用片段:
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$onepage = '''ཐ''''
$sql = "select id from article where channel=''''$channelid''''";
$query = mysql_query ($sql);
$num = mysql_num_rows ($query);
$allpages = ceil ($num / $onepage);
for ($i = 0;$i$allpages; $i++){
if ($i == 0){
$indexpath = "index.html";
} else {
$indexpath = "index_".$i."html";
}
$start = $i * $onepage;
$list = ''''''''
$sql_for_page = "select name,filename,title from article where channel=''''$channelid'''' limit $start,$onepage";
$query_for_page = mysql_query ($sql_for_page);
while ($result = $query_for_page){
$list .= ''''''''.$title.''''
''''
}
$content = str_replace ("{ articletable }",$list,$content);
if (is_file ($indexpath)){
@unlink ($indexpath); //若文件已存在,則刪除
}
$handle = fopen ($indexpath,"w"); //打開文件指針,創建文件
/*
檢查文件是否被創建且可寫
*/
if (!is_writable ($indexpath)){
echo "文件:".$indexpath."不可寫,請檢查其屬性後重試!"; //修改為echo
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
echo "生成文件".$indexpath."失敗!"; //修改為echo
}
fclose ($handle); //關閉指針
}
fclose ($fp);
die ("生成分頁文件完成,如生成不完全,請檢查文件許可權系統後重新生成!");
?
大致思路如此,其中如其它數據生成,數據輸入輸出檢查,分頁內容指向等可酌情在頁面中加入。
在實際文章系統處理過程當中,還有許多問題有待考慮,與動態頁面不同之處,需注意的地方還有很多。但大致思路即是如此,其它方面可舉一反三而得。

2. php網頁運行原理

轉載以下,希望對你有幫助:

你有沒有想過PHP是怎麼在瀏覽器里輸出「你好世界」的?我也是看了PHP內核和擴展後才知道的。也許有些朋友也想知道其中原理,那就讓我們開始吧。

在上一篇網志里我簡單介紹了「在我瀏覽這個頁面之前都發生了些什麼?」這個問題。如果你錯過了就點這里看看吧。現在我要討論的是「PHP是怎樣在瀏覽器里輸出內容」這個問題。

簡介

先看看下面這個過程:

1. 我們從未手動開啟過PHP的相關進程,它是隨著Apache的啟動而運行的;
2. PHP通過mod_php5.so模塊和Apache相連(具體說來是SAPI,即伺服器應用程序編程介面);
3. PHP總共有三個模塊:內核、Zend引擎、以及擴展層;
4. PHP內核用來處理請求、文件流、錯誤處理等相關操作;
5. Zend引擎(ZE)用以將源文件轉換成機器語言,然後在虛擬機上運行它;
6. 擴展層是一組函數、類庫和流,PHP使用它們來執行一些特定的操作。比如,我們需要mysql擴展來連接MySQL資料庫;
7. 當ZE執行程序時可能會需要連接若干擴展,這時ZE將控制權交給擴展,等處理完特定任務後再返還;
8. 最後,ZE將程序運行結果返回給PHP內核,它再將結果傳送給SAPI層,最終輸出到瀏覽器上。

深入探討

等等,沒有這么簡單。以上過程只是個簡略版,讓我們再深入挖掘一下,看看幕後還發生了些什麼。

1. Apache啟動後,PHP解釋程序也隨之啟動;
2. PHP的啟動過程有兩步;
3. 第一步是初始化一些環境變數,這將在整個SAPI生命周期中發生作用;
4. 第二步是生成只針對當前請求的一些變數設置。

PHP啟動第一步

不清楚什麼第一第二步是什麼?別擔心,我們接下來詳細討論一下。讓我們先看看第一步,也是最主要的一步。要記住的是,第一步的操作在任何請求到達之前就發生了。

1. 啟動Apache後,PHP解釋程序也隨之啟動;
2. PHP調用各個擴展的MINIT方法,從而使這些擴展切換到可用狀態。看看php.ini文件里打開了哪些擴展吧;
3. MINIT的意思是「模塊初始化」。各個模塊都定義了一組函數、類庫等用以處理其他請求。

一個典型的MINIT方法如下:

PHP_MINIT_FUNCTION(extension_name){

/* Initialize functions, classes etc */

}

PHP啟動第二步

1. 當一個頁面請求發生時,SAPI層將控制權交給PHP層。於是PHP設置了用於回復本次請求所需的環境變數。同時,它還建立一個變數表,用來存放執行過程中產生的變數名和值。
2. PHP調用各個模塊的RINIT方法,即「請求初始化」。一個經典的例子是Session模塊的RINIT,如果在php.ini中啟用了Session 模塊,那在調用該模塊的RINIT時就會初始化$_SESSION變數,並將相關內容讀入;
3. RINIT方法可以看作是一個准備過程,在程序執行之間就會自動啟動。

一個典型的RINIT方法如下:

PHP_RINIT_FUNCTION(extension_name) {

/* Initialize session variables, pre-populate variables, redefine global variables etc */

}

PHP關閉第一步

如同PHP啟動一樣,PHP的關閉也分兩步:

1. 一旦頁面執行完畢(無論是執行到了文件末尾還是用exit或die函數中止),PHP就會啟動清理程序。它會按順序調用各個模塊的RSHUTDOWN方法。
2. RSHUTDOWN用以清除程序運行時產生的符號表,也就是對每個變數調用unset函數。

一個典型的RSHUTDOWN方法如下:

PHP_RSHUTDOWN_FUNCTION(extension_name) {

/* Do memory management, unset all variables used in the last PHP call etc */

}

PHP關閉第二步

最後,所有的請求都已處理完畢,SAPI也准備關閉了,PHP開始執行第二步:

1. PHP調用每個擴展的MSHUTDOWN方法,這是各個模塊最後一次釋放內存的機會。

一個典型的RSHUTDOWN方法如下:

PHP_MSHUTDOWN_FUNCTION(extension_name) {

/* Free handlers and persistent memory etc */

}

這樣,整個PHP生命周期就結束了。要注意的是,只有在伺服器沒有請求的情況下才會執行「啟動第一步」和「關閉第二步」。

3. php模板技術php是怎麼向模板中傳值的呢

模板引擎的原理就是先在模板上需要寫上變數地方先寫幾個自己設置的佔位符
等php文件調用的時候,根據實際變數把他替換掉
給你一個簡單的比方:
<body>
{$names}
</body>
這是一個簡單的模板,比如這個文件名叫:index.htm
然後:
<?php
$Names = '小明'
$Contents = file_get_contents('index.htm');
$Html = preg_replace('/{\$(.*)}/i', '<?php echo $1;?>', $Contents);
file_put_contents('index.tpl.php', $Html);
echo include_once 'index.tpl.php';
?>
這樣,你運行後,頁面上就會顯示 小明 2 個字
查看源代碼就會看到
<body>
小明
</body>
當然,模板引擎技術,遠遠不是上面所說的那麼簡單,但原理是產不多的

4. php 的框架與模板

樓主的認知不對哦,以下為樓主解惑:

框架:在php源碼的基礎上,開發者將常用的功能進行二次封裝形成的代碼集合,其本身往往不具備任何可用的功能,其目的僅僅是使開發人員可以基於框架更快的開發出符合要求的應用。例如,不使用框架開發一個用戶管理功能可能需要5天,使用框架可以將這個時間縮短到2天。實際上,對於任何一個項目,訪問控制、資料庫訪問、文件處理等功能都是必備的,框架就是將這些常用功能進行了更易用的封裝,避免開發人員在通用組件上重復開發,浪費時間。

模板:為了將PHP內容和html內容更好的分離為目的產生的一種應用,其主要目的是為了網頁製作人員可以不去學習PHP就能修改頁面的內容(可惜不學PHP還要學smarty,因此我個人並不覺得模板真的能帶來什麼實際的好處)

另外,如dede,DZ,PHPCMS等是基於PHP的產品,本身已經具備了大量的功能,安裝之後就能使用,當然,因為需求的不同可能需要在該產品的基礎上進行二次開發。

綜述,模板沒有太大的價值,完全可以在非用不可的時候再去學習,對於PHP開發人員來說,smarty可以立刻上手。它可以(也只能)被框架或PHP產品使用。框架是必須掌握的,定製性很強的項目必然都是基於框架開發的。PHP產品,如果你要開發的項目和某個PHP產品的功能達到80%以上的契合,那麼應該考慮基於該產品進行開發。

一些網站提供簡單的博客,留言板等的源碼,不基於框架的小項目實際上只能稱為練習,只有參考價值。

註:不是說不使用框架的項目就不算項目,事實上如果一個項目如果沒有使用某某框架,其項目的一部分代碼也必然的會具有框架的特徵,即自定義框架也是框架。

5. PHP模板是什麼

平常我們做一個互動式網站,一定會關注兩個主要的問題,就是美工和程序。這也是一個網站在建設中拋開其內容之後最關鍵的要素。

通常有兩種方式來協調美工和程序之間的關系:

1.先做好美工頁面,然後由程序員直接在美工頁面的Html文件中嵌入ASP、jsp、PHP等程序代碼。

2.美工和程序同時進行,但這時因為沒有頁面框架,程序只能做出一些關鍵代碼,雙方完成後再進行一次美工頁面和程序代碼的嵌入合成。

在實際的網站建設過程中,由於人員、進度等環境的限制,大家通常會混合地使用上面兩種協調方式。然而這兩種方法都有不足之處:

1. 效率不高。兩者協調不好可能產生等待、重復代碼調試步驟等現象;

2. 調試不暢。由於程序代碼最終需要嵌入在HTML頁面中,代碼的嵌入、調試、糾錯都比較繁瑣;

3. 維護不便。一旦美工設計需要修改,如網站改版,那麼所有程序和HTML代碼混合頁面都需要重寫;

如果你正在使用PHP程序建設網站,那麼PHP的模板技術會比較圓滿地解決上述問題。

那麼什麼是PHP的模板技術?PHP模板即PHPlib的Template技術,是PHPLIB程序庫中的一個主要模塊之一,發展自Perl的Template。而PHPLIB則是在PHP上的一個擴展,提供了很多類庫,能夠方便地實現一些基本功能如用戶認證,資料庫封裝等。

現在PHP模板技術很多,不過建議你學習smarty,畢竟是官方的東西!
smarty學習很簡單的,你去下載一個smarty手冊,對照著學,基本上二天就可以學會了!

6. php偽靜態 和 php模板 區別在哪,怎樣做php偽靜態。

php偽靜態 是把你的鏈接改成 html後綴之類的,從鏈接上看起來像靜態的頁面。

php模板只是提供給php程序顯示數據的,php模板雖然可以是htm格式,但是在打開網頁的時候仍然是php格式的。

PHP實現偽靜態化頁面方法一:
在你的程序初始化時使用如下代碼:
<?php
$Php2Html_FileUrl = $_SERVER["REQUEST_URI"];
$Php2Html_UrlString = str_replace("/", "", strrchr($Php2Html_FileUrl, "/"));
$Php2Html_UrlQueryStrList = explode("@", $Php2Html_UrlString);
foreach($Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr)
{
$Php2Html_TmpArray = explode("|", $Php2Html_UrlQueryStr);
$_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1];
}
echo '假靜態:$_GET變數<br />';
print_r($_GET);
?>
然後php中調用$_GET變數就像平常一樣了。
連接使用方式:
****.php/param1|1234@param2|4321
和****.php?param1=1234?m2=4321一樣。
PHP實現偽靜態化頁面方法二:通過URL Rewrite實現鏈接靜態化
我們知道搜索引擎對於靜態頁面是非常友好的,因此很多網站通過生成靜態頁面等手段方便爬蟲抓取自己網站的內容。但是有時候一些應用並不適合全部靜態化,比如數據變化非常大的論壇/貼吧系統,這時候我們可以通過URL重寫來實現鏈接的偽靜態化,即網站對外使用靜態化的鏈接,而內部實際上仍然使用動態頁面的 URL形式。比如像這樣一個鏈接:http://www.ci123.com/abc.php?action=a&id=1,我們可以改寫成http://www.ci123.com/abc/a/1.html的形式。這是搜索引擎優化最重要的內容之一,它還有一個額外的好處,可以使頁面有一個永久鏈接,即便以後網站系統內部鏈接有變化,通過適當改變Rewrite規則就可以保證原先的外部URL一直有效。
下面介紹2種簡單的Apache+PHP下實現URL重寫的方法,第一種適合有伺服器配置許可權的用戶,第二種適合租用空間的用戶,也作為我近期的學習心得的整理。
1、對於有伺服器配置許可權的用戶,推薦使用Apache的mod_rewrite模塊,這里假設已經安裝好mod_rewrite模塊。打開Apache的配置文件,找到相應主機的部分,添加以下代碼:
RewriteEngine On RewriteRule ^/abc/([a-z]+)/([0-9]+).html$ /abc.php?action=$1&id=$2
然後在shell里執行service httpd reload,讓Apache重新載入配置就好了。現在在PHP頁面裡面我們可以把鏈接寫成 abc/a/1.html的形式,Apache在解析這個 URL的時候會rewrite成abc.php?action=a&id=1的形式,並返回正確的頁面。運用正則表達式我們可以實現幾乎任何我們想要的鏈接形式,mod_rewrite模塊的功能異常強大,這里只是一個及其簡單的應用。
2、對於租用空間的用戶,一般都沒有辦法修改Apache的配置,這里有個變通的方法,原理是這樣的:當要傳遞參數訪問PHP 頁面時,正常情況下是通過自動全局變數$_GET來獲得,比如上面的鏈接,在頁面里可以通過$_GET['action'] 和 $_GET['id'] 來獲得,重寫URL後就不行了。現在在每個頁面里require一個url_rewrite.php文件,裡面代碼如下:
$filename = basename($_SERVER['SCRIPT_NAME']);

if (strtolower($filename) == "abc.php"){
if (!empty($_GET[id])){
$id = intval($_GET[id]);
$action = intval($_GET[action]);
}
else {
$nav = $_SERVER["REQUEST_URI"];
$script = $_SERVER["SCRIPT_NAME"];
$nav = ereg_replace("^$script", "", urldecode($nav));
$vars = explode("/", $nav);
$action = intval($vars[1]);
$id = intval($vars[2]);
}
}
這樣$action和$id也得到了,頁面里鏈接可以寫成abc.php/a/1的形式來訪問相應頁面。
需要注意的是這種PHP實現偽靜態化頁面方法效率較第一種低,第一種方法是在WEB伺服器URL解析過程中實現的,而這里是在PHP頁面解析過程里實現的,第2種方法只是變通,不得已而為之,要修改鏈接形式很不方便也不靈活。

熱點內容
快速指數演算法 發布:2025-02-04 20:20:40 瀏覽:297
python在類中定義函數調用函數 發布:2025-02-04 20:14:47 瀏覽:594
安卓手機的壁紙是哪個 發布:2025-02-04 20:14:44 瀏覽:197
java發展前景 發布:2025-02-04 20:10:19 瀏覽:76
mac登陸密碼哪裡設置 發布:2025-02-04 19:50:20 瀏覽:525
手游腳本封號 發布:2025-02-04 19:42:12 瀏覽:435
玩單機游戲要哪些配置的電腦 發布:2025-02-04 19:17:41 瀏覽:1003
c語言編程圖書 發布:2025-02-04 19:01:52 瀏覽:898
在哪裡開啟密碼顯示 發布:2025-02-04 18:38:30 瀏覽:791
怎麼查詢qq密碼 發布:2025-02-04 18:20:10 瀏覽:515