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

  • PHP5應用實例詳解
  • 王志剛 朱蕾編著
  • 5025字
  • 2018-12-27 19:51:57

1.1 PHP技術的由來

1.1.1 服務器端腳本的發展軌跡——服務器端技術以前的技術

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

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

HTML(HyperText Markup Language)

在急速的文檔電子化的潮流中,曾出現過各種各樣格式的電子文檔。可是做成的電子文檔,只是實現精美印刷這樣的一個目的。很多被稱為“標準”的格式,最終并沒有成為標準,而且現在很多都消失了。

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

ActiveX/Java Applet

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

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

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

客戶端、服務器端腳本

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

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

但是,這些用腳本語言開發出來的程序網頁盡管看起來是動態的,其實數據資源是靜態的。因此,客戶端、服務器端腳本是Web上“文字公開”的解決方案,并不是Web的基本構架。

1.1.2 服務器端腳本的發展軌跡——CGI的時代

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

客戶端腳本的極限

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

● 不能信息加工

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

● 邏輯的復雜性與網頁大小的比例

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

● 客戶端環境依存

這里提醒大家的一點是,說到客戶端,并不是只指桌面個人電腦的客戶端,手機以及其他手持電子設備也包括在內,形態是多種多樣的。

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

● 程序的安全性

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

CGI(Common Gateway Interface)

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

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

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

圖1-1 服務器端腳本的運作機制

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

● 耗費服務資源太多

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

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

● 開發時要注意底層的協議

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

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

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

● 網頁設計與編程開發

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

1.1.3 服務器端腳本軌跡——服務器端腳本

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

● 腳本語言

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

● HTML嵌入式語言

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

● 容易掌握的高級語言

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

現在,PHP中面向對象的思想也得到了強化,對于重復使用性、維護性好的大規模網站也能很容易地搭建了。

● 豐富的程序庫

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

● 容易與各種類型的數據庫連接

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

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

1.1.4 各種服務器技術的比較

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

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

CGI與PHP

正如以前所介紹的,CGI是古典的服務器端技術,在開發的生產性、可維護性、易學性上不怎么讓人滿意。

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

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

ASP.NET與PHP

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

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

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

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

JSP/Servlet與PHP

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

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

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

JSP的分工開發的優勢,對那些中小規模的網站來說,優勢顯得并不明顯,然而,PHP在構筑中小規模的網站時擁有更大的靈活性。最新的PHP5.0中強化了面向對象的概念后,構筑大規模的網站時,開發再利用性好,可維護性強的代碼成為可能。

表1-1總結了各種服務器技術與PHP的比較。

表1-1 各種服務器技術與PHP的比較

主站蜘蛛池模板: 大竹县| 乌海市| 绍兴县| 宣武区| 同德县| 乌拉特后旗| 南郑县| 吉隆县| 广东省| 保山市| 独山县| 巫山县| 建昌县| 绥阳县| 阳山县| 印江| 益阳市| 赞皇县| 利津县| 离岛区| 瓦房店市| 义马市| 桑日县| 温州市| 玛纳斯县| 仙游县| 濮阳县| 宁明县| 永胜县| 绥德县| 哈密市| 大名县| 军事| 峡江县| 开封市| 荔浦县| 威海市| 衡阳县| 乐平市| 四川省| 电白县|