官术网_书友最值得收藏!

1.1 PHP技術(shù)的由來

1.1.1 服務(wù)器端腳本的發(fā)展軌跡——服務(wù)器端技術(shù)以前的技術(shù)

Web技術(shù)的發(fā)展總是曲線的,有時因為某種原因而得到修正提高,各種各樣的技術(shù)興盛而又衰退。復(fù)雜的技術(shù)進步軌跡也是Web發(fā)展的一個很有趣的地方。從這個意義上說,服務(wù)器技術(shù)不僅是Web系統(tǒng)的最佳解決方案,而是Web技術(shù)發(fā)展的一個重要方面。

本節(jié)將介紹PHP(PHP,Hypertext Preprocessor)所代替的服務(wù)器端技術(shù)在整個Web技術(shù)發(fā)展中所處的位置,以及PHP在服務(wù)器端技術(shù)中所處的分量。

HTML(HyperText Markup Language)

在急速的文檔電子化的潮流中,曾出現(xiàn)過各種各樣格式的電子文檔??墒亲龀傻碾娮游臋n,只是實現(xiàn)精美印刷這樣的一個目的。很多被稱為“標準”的格式,最終并沒有成為標準,而且現(xiàn)在很多都消失了。

Web是作為基礎(chǔ)技術(shù)以打破文檔電子化時代混亂的面貌出現(xiàn)的,廣泛應(yīng)用的HTML技術(shù)是其中的標準技術(shù)之一。HTML(HyperText Markup Language)里有諸如<HTML>、<h1>的“對(tag)”。在“對”中間包含具體的文字,作為標示語言文檔的構(gòu)造,格式的定制都非常簡單。盡管有許多像語義不夠精確、實際安裝時文件比較大等不足的地方,但是HTML作為Web系統(tǒng)的基礎(chǔ)技術(shù)之一,功績是不可磨滅的。后來,隨著插件技術(shù)(Plugin)、CSS(Cascading Style Sheets)技術(shù)等的發(fā)展,HTML技術(shù)的表現(xiàn)力得到了飛躍的進步,但是最終HTML也只能提供生成靜態(tài)文檔的功能。因為那時,Web的主要目的只是文檔的公布。

ActiveX/Java Applet

后來,CSS和HTML保持著長期共存的關(guān)系,插件技術(shù)并沒有流行多久。確實曾經(jīng)有一個時期,有很多各種各樣的插件出現(xiàn),給用戶呈現(xiàn)了華麗而優(yōu)美的網(wǎng)頁效果。但是,因為需要強制用戶在客戶端安裝插件程序,總是給人不夠安全的感覺,不可能被大多數(shù)用戶所接受。

這個時候,作為替代方案——ActiveX、Java小程序(Applet)出現(xiàn)了。ActiveX和插入的Java小程序直接嵌入在網(wǎng)頁中,運行時自動安裝所需要的控件,省略了插件導(dǎo)入的步驟。ActiveX和Java小程序給開發(fā)人員帶來了最早在客戶端需要編程的想法。

網(wǎng)頁內(nèi)容有了動態(tài)的變化,確實給用戶帶來了享受的感覺,但是這兩樣技術(shù)的流行時間可以說都比較短。一個重要的原因就是用戶需要掌握比HTML更高級的語言,如Visual Basic、C++、Java等語言,而用戶能實現(xiàn)的只是“界面”等表面化的東西。當然,當時的網(wǎng)絡(luò)環(huán)境,如網(wǎng)絡(luò)速度、網(wǎng)絡(luò)普及程度也不夠發(fā)達,應(yīng)用ActiveX、Java小程序的網(wǎng)頁都顯示出得太慢,超過了用戶的忍耐度,也是其沒能流行起來的其中一個原因。

客戶端、服務(wù)器端腳本

但是,ActiveX和Java小程序技術(shù)所帶來的“客戶端編程”的想法,在用戶間流行起來了。顯示的網(wǎng)頁不再是靜止不動,而是隨著用戶的輸入、鼠標單擊,網(wǎng)頁顯示的內(nèi)容就會動態(tài)變化。所謂“交互式網(wǎng)站”的Web開發(fā)一時間流行起來了,這個時期正是全球規(guī)模的信息共享的目標達成之時,開發(fā)者的意識也從“如何實現(xiàn)信息共享”發(fā)展到了“如何做到與紙媒體的差別化”上來了。

能實現(xiàn)這些的就是客戶端腳本了。以Javascript、VBScript為代表的客戶端腳本語言是能在瀏覽器上運行的“簡易”語言。它們本來就是為瀏覽器定制的,所以與ActiveX及Java小程序比較起來,運行時顯得“輕”得多。基于這個理由,這兩種腳本已被用戶廣泛接受了。后來又將Dynamic HTML及DOM(Document Object Model)的概念引進來,這樣腳本語言的應(yīng)用范圍大大地擴展,功能也強化了。

但是,這些用腳本語言開發(fā)出來的程序網(wǎng)頁盡管看起來是動態(tài)的,其實數(shù)據(jù)資源是靜態(tài)的。因此,客戶端、服務(wù)器端腳本是Web上“文字公開”的解決方案,并不是Web的基本構(gòu)架。

1.1.2 服務(wù)器端腳本的發(fā)展軌跡——CGI的時代

Web是在獨特的文化中成長起來的,項目的前提有時也會變成了最終目的。正如1.1節(jié)里介紹的那樣,Web本來的目的就是為了“文檔公開共享”,但是從計算機技術(shù)的觀點來看,要達成這個目的,需要解決浩如煙海的信息的輸入/輸出,也伴隨著輸入/輸出的數(shù)據(jù)流程的問題。Web只有輸出的部分,在某種意義上顯得極端不自然。

客戶端腳本的極限

客戶端腳本在Web的數(shù)據(jù)處理中,有各種各樣的極限,下面將客戶端腳本內(nèi)包含的問題一一列舉出來。

● 不能信息加工

客戶端腳本只是實現(xiàn)了表面的動態(tài)化(Dynamic),所謂Dynamic HTML,只是從表面上表述了客戶端腳本的特性。而本質(zhì)上,客戶端腳本并不能改變網(wǎng)頁上的內(nèi)容,從這個意義上講還沒有逃脫“文檔公開”這個范圍。

● 邏輯的復(fù)雜性與網(wǎng)頁大小的比例

客戶端腳本,顧名思義,它只能在客戶端(瀏覽器)上運行,必須先將所有數(shù)據(jù)都下載到客戶端才能執(zhí)行。如果網(wǎng)頁有10 000條數(shù)據(jù),那么首先就要將這10 000條數(shù)據(jù)下載到客戶端,而網(wǎng)頁實際上用到的可能只是其中很少的幾條,其余都是不需要的,這樣一來就影響了網(wǎng)頁的顯示速度。這種抽取需要或不需要數(shù)據(jù)的功能,是客戶端腳本所不具備的。

● 客戶端環(huán)境依存

這里提醒大家的一點是,說到客戶端,并不是只指桌面?zhèn)€人電腦的客戶端,手機以及其他手持電子設(shè)備也包括在內(nèi),形態(tài)是多種多樣的。

對于依存客戶端環(huán)境的客戶端腳本來說,隨著終端設(shè)備的不同,對應(yīng)不同的編程。從發(fā)展到現(xiàn)在的情況來看,開發(fā)者將所有終端設(shè)備的情況都考慮進去進行編程設(shè)計是不可能的。造成的結(jié)果就是在客戶端只能安裝各終端設(shè)備共通的功能,這樣客戶端腳本的適用范圍就大大變小了。

● 程序的安全性

如“密碼”這種機密性很高的信息在網(wǎng)頁中處理的情況是很常見的。使用客戶端腳本時,必須全在客戶端公開。一些必須隱藏的信息,也必須全公開。最近出現(xiàn)的encode/uncode技術(shù),在一定程度上解決了這些問題。

CGI(Common Gateway Interface)

以上客戶端腳本所面對的問題,其實是數(shù)據(jù)處理都是在客戶端進行這個原因造成的,只要數(shù)據(jù)不在客戶端處理時,這些問題就迎刃而解。那么,客戶端以外的處理環(huán)境就是服務(wù)器了。

服務(wù)器上存儲了文檔、程序,以及其他相關(guān)數(shù)據(jù)。那些對用戶來說沒有用處的程序、不需要的數(shù)據(jù)其實不用通過網(wǎng)絡(luò)傳送了,需要隱藏的數(shù)據(jù)就不會通過網(wǎng)絡(luò)泄露。服務(wù)器將完成所有的處理,只是將處理的結(jié)果以HTML的形式傳送到客戶端的瀏覽器。

這些服務(wù)器端的處理模式,其實并不陌生。Perl(Practical Extraction and Reporting Language)和以C為代表的CGI(Common Gateway Interface),就是以這些現(xiàn)在大家都很熟悉的模式運行的(如圖1-1所示)。

圖1-1 服務(wù)器端腳本的運作機制

在內(nèi)容為主體的網(wǎng)頁中,以開發(fā)網(wǎng)頁的計數(shù)器、訪問列表這樣的小功能為目的,CGI具體對于以數(shù)據(jù)處理為中心的服務(wù)器端技術(shù)來說,缺點是顯而易見的。CGI在開發(fā)難度、保守性、性能表現(xiàn)來講,都有不足之處。

● 耗費服務(wù)資源太多

CGI是從服務(wù)器上調(diào)用的外部程序的總稱,也就是說,用戶每發(fā)出一次請求(Request)就需要建立一個新的執(zhí)行進程,用戶送出多少次的請求就要生成多少次通信進程。對小的CGI程序來說,對服務(wù)器資源的占用不會有什么問題,但對那些復(fù)雜的商業(yè)應(yīng)用程序來講,有限的服務(wù)器資源就有被耗盡的危險,這就是所謂的“資源瓶頸”問題。

對于用戶數(shù)變動很大的Web系統(tǒng)來講,資源變動的脆弱性這個缺點可以說是致命的。

● 開發(fā)時要注意底層的協(xié)議

Perl和C語言并不是專門為Web程序而開發(fā)的,CGI開發(fā)者在開發(fā)中,必須要注意照顧到Web特有的協(xié)議(如UTP,HTTP等)。這些不僅僅意味著掌握CGI編程需要一定的技術(shù)水平,同時也意味著CGI存在開發(fā)瓶頸。

Perl開發(fā)的程序里沒有“Session”的概念,A網(wǎng)頁上的信息經(jīng)過B網(wǎng)頁,準備在C網(wǎng)頁上顯示時,CGI開發(fā)者必須自行設(shè)計框架來解決這個問題。

其他的,連現(xiàn)在Web開發(fā)中經(jīng)常使用的“Cookie”,在CGI中也必須將HTTP考慮進來專門編寫代碼。還有,當開發(fā)者想將一系列的程序當成一個項目來組織時,CGI就很難辦到了。

● 網(wǎng)頁設(shè)計與編程開發(fā)

Perl也好,C也罷,實際上是通用開發(fā)語言,只是將處理結(jié)果按照HTTP的規(guī)則顯示出來而已。所以如果就連一個HTML的“對”都得用print語言將其輸出出來的話,則這就意味著,對于開發(fā)周期短的Web開發(fā)來說,所有作業(yè)都得在其中編程。而邏輯由程序員負責,內(nèi)容由編輯負責,設(shè)計由設(shè)計人員來分擔的這種合作開發(fā)模式,在CGI開發(fā)中就很難辦到了。

1.1.3 服務(wù)器端腳本軌跡——服務(wù)器端腳本

正因為CGI有以上所介紹的這些缺點,慢慢地就不怎么受開發(fā)者的青睞了。這時候就出現(xiàn)了被稱為CGI后繼的技術(shù)。PHP就是這些技術(shù)之一。下面就PHP是一種什么樣的技術(shù),有些什么樣的特性做些簡單的介紹。

● 腳本語言

PHP是一門初級程序員都可以用來寫出有用有效程序的語言,有著逐行順次進行解釋的、很容易重復(fù)and-error式的循環(huán),能保證很高的生產(chǎn)效率等優(yōu)勢。性能表現(xiàn)盡管不能和那些能編譯的語言相比,但是從PHP4開始,搭載上高性能的腳本處理引擎Zend Engine后,也能實現(xiàn)高速的處理,實際運行時幾乎不產(chǎn)生瓶頸問題。在最新的PHP5中,Zend Engine升級到2.0后,處理的效率更高了。

● HTML嵌入式語言

PHP必須嵌入在HTML中才能運行。與HTML有天然的親和性,只要處理則能寫出很優(yōu)秀的程序。結(jié)果直接在HTML中輸出就可以了,不需要輸出部分的編程,實際的邏輯部分非常短小精悍。

● 容易掌握的高級語言

與Perl、Javascript這些C語言系列的語言很相似,PHP也擁有自己的語言格式。掌握了上述語言的開發(fā)人員很容易上手,即使是第一次接觸腳本語言的程序員,基本上都能在短時間內(nèi)掌握它。

現(xiàn)在,PHP中面向?qū)ο蟮乃枷胍驳玫搅藦娀?,對于重?fù)使用性、維護性好的大規(guī)模網(wǎng)站也能很容易地搭建了。

● 豐富的程序庫

毫不夸張地說,只要是想實現(xiàn)的功能,都能找得到相應(yīng)的PHP程序庫。PHP開發(fā)時,將單個功能的程序塊進行組合,就能實現(xiàn)復(fù)雜的商業(yè)邏輯,不用從零開始寫那些原始的邏輯了。也正因為這樣,初級程序員就能很容易地讀懂PHP程序。

● 容易與各種類型的數(shù)據(jù)庫連接

像MySQL、PostgreSQL等免費的數(shù)據(jù)庫,還有Oracle、Sybase、Informix、SQL Server等商用的數(shù)據(jù)庫,以及ODBC等通用的數(shù)據(jù)庫接口等主要的數(shù)據(jù)庫產(chǎn)品接口都內(nèi)置在PHP程序包中,且可以自由安裝或卸載。

最新的PHP5中輕量數(shù)據(jù)庫引擎SQLite也已被內(nèi)置。只要安裝了PHP,就能構(gòu)筑數(shù)據(jù)庫連接的應(yīng)用程序了。當然,數(shù)據(jù)庫連接和服務(wù)器端技術(shù)并非等價,但肯定是個極其重要的優(yōu)勢。PHP和數(shù)據(jù)庫的無縫結(jié)合能提供更簡便、高級的解決方案。

1.1.4 各種服務(wù)器技術(shù)的比較

上述介紹的PHP構(gòu)架并不是新鮮的技術(shù)。這之前介紹的以Perl、C等為代表的古典的CGI,以及Windows平臺的ASP.NET,還有以跨多平臺的處理環(huán)境為特征的,由Java語言構(gòu)筑的JSP/Servlet等,都有很廣泛的支持。

就服務(wù)器端腳本技術(shù)來講,各自的技術(shù)特征總是千差萬別的。本節(jié)選擇其中幾種典型腳本語言與PHP進行比較,讓大家從橫向上更好地了解一下PHP。

CGI與PHP

正如以前所介紹的,CGI是古典的服務(wù)器端技術(shù),在開發(fā)的生產(chǎn)性、可維護性、易學(xué)性上不怎么讓人滿意。

然而,PHP本來就是為制作Web網(wǎng)站而定制的語言,功能也是為Web定制的。那些經(jīng)常使用的功能都作為函數(shù)提前準備好了,入門者可以很容易學(xué)會。在PHP中出錯信息的生成功能也是很充分的,在程序調(diào)試時可以充分感受到。

因為PHP已經(jīng)和Web服務(wù)器組裝在了一起,因此不用每次生成請求時都生成新的進程了。雖然在Web服務(wù)器里組裝進了PHP腳本翻譯器而運行時顯得“重”,但隨著現(xiàn)在Web服務(wù)器中引進了動態(tài)模塊的概念后,可根據(jù)需要動態(tài)載入,這在一定程度上解決了這個問題。

ASP.NET與PHP

ASP.NET是在Windows環(huán)境下運行的服務(wù)器端腳本,在HTML中嵌入被稱為服務(wù)器控件(Server Control)的“標簽”(tag),擁有在服務(wù)器端技術(shù)中被稱為事件驅(qū)動模型的獨特構(gòu)架。

在ASP 3.0中拋棄了以前的VBScript、JScript等解釋型語言,采用了Visual Basic、C#等編譯型語言后,成功地提升了性能,并提供了各種語言都能使用的類庫。靈活的數(shù)據(jù)庫應(yīng)用、強大的文件處理、字符串處理、簡便的自定義函數(shù)等,都是其用戶迅速增加的原因。

但是,就其運行環(huán)境限制在Windows+IIS(Internet Information Services)平臺的這一點來講,在普及上還是有很大的局限性的。最近由Mono工程組(http://www.mono-project.com)開發(fā)的能在Linux等UNIX系列操作系統(tǒng)運行的,公開源碼的.NET環(huán)境的出現(xiàn),給普及帶來了一絲希望。從實際使用情況來看,在UNIX環(huán)境下廣泛使用.NET還有很長的路要走。

然而,PHP原則上在UNIX/Windows/Mac等操作系統(tǒng)上都能運行,從Web服務(wù)器產(chǎn)品來說,有Web服務(wù)器最大市場占有率第一的Apache,還支持IIS、Sun Java System Web服務(wù)器等重要的服務(wù)器產(chǎn)品,平臺的通用性正是PHP的魅力之處。

JSP/Servlet與PHP

JSP(Java Server Pages)/Servlet是具有代表性的Web開發(fā)語言Java的服務(wù)器端版本。

大家知道Java語言追求“Write Once,Run Anywhere”的開發(fā)概念,這在多樣化的服務(wù)器環(huán)境中是非常重要的因素。JSP/Servlet不用選擇環(huán)境,其代碼在不同的環(huán)境中能保證很好的移植性。Servlet負責應(yīng)用程序的邏輯部分,而JSP用于網(wǎng)頁顯示,彼此分工明確。邏輯部分能夠被再利用,從而能保證很高的生產(chǎn)效率,以及可維護性。

但是,Java語言再怎么好用,與腳本語言比較起來,對一般的開發(fā)人員來說,還是顯得門檻有點高。盡管最近標榜著EoD(Ease of Development容易開發(fā)),以及比如JSF(Java Server Faces)、Groovy等新技術(shù)也紛紛登場,與追求直觀易懂的PHP比較起來,還是需要花更多的時間去學(xué)習(xí)的。

JSP的分工開發(fā)的優(yōu)勢,對那些中小規(guī)模的網(wǎng)站來說,優(yōu)勢顯得并不明顯,然而,PHP在構(gòu)筑中小規(guī)模的網(wǎng)站時擁有更大的靈活性。最新的PHP5.0中強化了面向?qū)ο蟮母拍詈螅瑯?gòu)筑大規(guī)模的網(wǎng)站時,開發(fā)再利用性好,可維護性強的代碼成為可能。

表1-1總結(jié)了各種服務(wù)器技術(shù)與PHP的比較。

表1-1 各種服務(wù)器技術(shù)與PHP的比較

主站蜘蛛池模板: 文化| 文山县| 礼泉县| 达拉特旗| 萝北县| 大城县| 鸡西市| 陈巴尔虎旗| 衡阳县| 湖北省| 建始县| 南阳市| 昭平县| 镇江市| 万年县| 吉木萨尔县| 新竹县| 廊坊市| 金华市| 靖安县| 宜都市| 延边| 高台县| 泗水县| 那坡县| 徐闻县| 阳谷县| 固阳县| 阜南县| 永丰县| 厦门市| 宣城市| 永宁县| 英德市| 桐梓县| 满洲里市| 合作市| 麻城市| 涟水县| 鄂伦春自治旗| 桑日县|