Web技術(shù)進(jìn)階——PHP構(gòu)建網(wǎng)站
發(fā)布時(shí)間:2008-08-23 閱讀數(shù): 次 來源:網(wǎng)樂原科技
當(dāng)建設(shè)一個(gè)網(wǎng)站的時(shí)候,絕大多數(shù)時(shí)候不僅需要它能夠提供靜態(tài)網(wǎng)頁訪問能力,還希望它能和瀏覽器用戶交互、訪問后臺(tái)數(shù)據(jù)庫提供實(shí)時(shí)更新的信息等等,一句話,要提供動(dòng)態(tài)網(wǎng)頁服務(wù)能力。這時(shí),你是選擇傳統(tǒng)方式的CGI呢,還是選擇PHP、ASP等服務(wù)器端腳本呢?
■從CGI到服務(wù)器端腳本
創(chuàng)建動(dòng)態(tài)網(wǎng)頁的標(biāo)準(zhǔn)方式是CGI,這種方式允許Web服務(wù)器運(yùn)行一個(gè)CGI程序來回應(yīng)瀏覽器的請(qǐng)求。除了要遵從簡(jiǎn)單的CGI標(biāo)準(zhǔn)之外,CGI程序的開發(fā)與普通程序開發(fā)沒有什么區(qū)別。然而,隨著要生成的動(dòng)態(tài)網(wǎng)頁的數(shù)量和復(fù)雜程度的增加,這種方式就遇到了困難。
CGI程序包括兩個(gè)主要部分,一個(gè)是程序代碼,另一個(gè)是要輸出的HTML文檔內(nèi)容,可以稱作HTML代碼。最早的Web開發(fā)者既是程序員,又是網(wǎng)頁設(shè)計(jì)者,但是那時(shí)的頁面都比較簡(jiǎn)單,開發(fā)者最關(guān)心的是程序代碼的問題,頁面代碼基本上不需要太多的調(diào)整。而隨著包括DHTML、Javascript在內(nèi)的技術(shù)發(fā)展,使得頁面可以設(shè)計(jì)得非常復(fù)雜,而由于出現(xiàn)了各種CGI的程序庫,程序代碼則變得簡(jiǎn)單多了。這樣每進(jìn)行一次頁面代碼的調(diào)整,CGI程序就需要改動(dòng),以至于最后在CGI程序調(diào)試中,調(diào)試HTML代碼的工作量超過了調(diào)試程序代碼的工作量。這說明在Web開發(fā)中,HTML代碼的重要性已經(jīng)十分明顯,使得傳統(tǒng)的以程序代碼為中心的CGI程序不再是最適合的動(dòng)態(tài)網(wǎng)頁處理方式了。
這樣,相當(dāng)多的程序員對(duì)于這種調(diào)整HTML代碼的工作感到厭倦,尤其隨著Internet的商業(yè)化,編寫CGI程序和進(jìn)行HTML頁面設(shè)計(jì)已經(jīng)成為了兩種不同的職業(yè)。為了解決這個(gè)問題,程序員首先使用了模板文件的方法將程序代碼和HTML代碼分開,CGI程序讀取模板文件來獲得HTML代碼,從而使得在對(duì)頁面進(jìn)行較小調(diào)整的時(shí)候,不需要改動(dòng)CGI程序。
基本上每個(gè)程序員在自己的CGI程序中使用自定義的模板,然而,如果有一種通用的HTML模板,使用通用的程序進(jìn)行預(yù)處理,這樣不就大大減少了程序設(shè)計(jì)的工作量嗎?最簡(jiǎn)單的模板可以通過替換模板中預(yù)定義的變量來完成解釋工作,由于這種程序簡(jiǎn)單而有效,因此就被集成在Web服務(wù)器中,以提供比CGI程序更高的效率,這就是最早的服務(wù)器端腳本。
這些早期的服務(wù)器端腳本,例如出現(xiàn)在ncsa httpd的SSI,只包括變量的概念,但沒有控制語句的概念。后來,不同的程序開發(fā)者重新開發(fā)了支持控制語句,甚至支持子程序的腳本解釋處理程序,使得這些程序不僅能為特定的動(dòng)態(tài)網(wǎng)頁服務(wù),而且能夠進(jìn)行編程,因而能夠完成CGI程序能完成的所有工作,成為了一種新的編程語言。同樣是由于性能的緣故,這些程序被合并入Web服務(wù)器本身,這就它成為Web開發(fā)的一種新形式。
■來自開放資源的PHP
當(dāng)前,服務(wù)器端腳本已經(jīng)是開發(fā)動(dòng)態(tài)網(wǎng)頁的常用方式,雖然CGI仍然具備靈活的優(yōu)勢(shì),但在一般情況下,使用服務(wù)器端腳本更容易和方便。然而,與CGI不同的是,服務(wù)器端腳本沒有一個(gè)統(tǒng)一的標(biāo)準(zhǔn),不同的服務(wù)器端腳本使用各自的語法。當(dāng)前比較常用的有:Active Server Pages(ASP),ColdFusion,Java Servlets,Personal Home Page(PHP)等。這些技術(shù)中,既包括有大公司支持的軟件,如ASP,也包括通過Internet進(jìn)行合作開發(fā)的開放源代碼軟件,如PHP。
PHP正是這樣一種服務(wù)器端腳本語言,它最開始是由Rasums Lerdorf編寫的,只是一個(gè)簡(jiǎn)單的用Perl語言編寫的CGI程序,用于記錄訪問他自己的網(wǎng)頁的訪問者。以后它又被用C語言重新寫過,范圍擴(kuò)大到訪問數(shù)據(jù)庫。在這期間,有許多人向Rasums Lerdorf要此程序的拷貝,以便自己使用,Rasums Lerdorf為此寫了一些介紹此程序的文檔,并發(fā)布了PHP v1.0。以后,越來越多的人使用PHP,并強(qiáng)烈要求增加一些其他的特性,如循環(huán)語句和數(shù)組變量等,這時(shí)其他的一些程序員也開始參與PHP源碼的編寫,對(duì)PHP進(jìn)行了重新編寫,PHP v3.0就出現(xiàn)了。當(dāng)前,使用PHP的網(wǎng)站已經(jīng)超過80萬,并且還在不斷地增加。
除了向?yàn)g覽器發(fā)送動(dòng)態(tài)網(wǎng)頁之外,PHP還能發(fā)送不同HTTP頭標(biāo)識(shí),使其能提供網(wǎng)頁重定位、與Web服務(wù)器的安全認(rèn)證結(jié)合的能力、以及設(shè)置Cookie。PHP能提供與多種數(shù)據(jù)庫直接互聯(lián)的能力,包括MySQL、Sybase、Informix、Oracle、MsSQL等,也能支持ODBC。并通過額外的庫能夠支持會(huì)話管理和XML處理(這些庫都是基本的庫,因此也是PHP用戶的基本配置)。從這里我們可以看出,PHP已經(jīng)不再是簡(jiǎn)單的服務(wù)器端腳本了,按照《PHP3瀏覽器應(yīng)用編程》的作者David Medinets的話,PHP是一種應(yīng)用服務(wù)器。因?yàn)樗粌H僅包括一個(gè)完整的編程語言,而且還包括完整的訪問數(shù)據(jù)庫的能力、支持Internet協(xié)議(如電子郵件和HTTP)的能力,這一整套技術(shù)使得PHP能與ASP、ColdFusion、WebSphere互較短長。
要運(yùn)行PHP,通常使用Linux或FreeBSD作為操作系統(tǒng),使用Apache作為Web服務(wù)器。當(dāng)然使用其他操作系統(tǒng)也同樣可行,這是因?yàn)镻HP是一種跨平臺(tái)的軟件,這當(dāng)然得益于它是開放源代碼的軟件。但是,如果不使用Apache服務(wù)器,那么PHP就只能以CGI的方式運(yùn)行,這樣就不能利用將PHP編譯進(jìn)Apache帶來的性能優(yōu)勢(shì)。當(dāng)從www.php3.net中下載了最新版本的PHP并安裝配置完畢之后,就可以使用編輯器或網(wǎng)頁制作軟件來編寫PHP代碼了。如果你能使用C或Perl進(jìn)行編程,就會(huì)發(fā)現(xiàn)PHP編程并不復(fù)雜,作為程序語言的PHP比C簡(jiǎn)單,比Perl易懂。下面是一個(gè)最簡(jiǎn)單的嵌入PHP程序的頁面。
〈HTML〉
〈HEAD〉〈TITLE〉Test〈/TITLE〉〈/HEAD〉
〈BODY〉
〈?PHP $string = 'world!'; ?〉
〈H1〉Hello,〈?php echo $string ?〉〈/H1〉
〈/BODY〉
〈/HTML〉
在HTML網(wǎng)頁中嵌入的PHP代碼,需要以標(biāo)記結(jié)束。上面這個(gè)頁面將顯示Hello,world!的結(jié)果。這里可以看出,PHP程序語法與C或Perl非常類似。事實(shí)上,PHP來源于C和Perl,支持C和Perl大部分語法和操作符,因此使用PHP對(duì)C和Perl程序員都是非常簡(jiǎn)單的事情。
■選擇PHP
雖然PHP已經(jīng)十分流行,但在國內(nèi)了解它的人卻很少,這當(dāng)然是因?yàn)樗皇巧虡I(yè)軟件,缺乏市場(chǎng)運(yùn)作。即使在聽說過PHP的人們中,不少人也抱有這樣的看法,PHP既沒有商業(yè)公司的支持,又缺乏商業(yè)的圖形化開發(fā)工具,PHP能夠和ASP等商業(yè)軟件一樣有前途嗎?的確,ASP由于有微軟公司的支持,使得它迅速變得十分流行,現(xiàn)在書店中充斥著ASP的相關(guān)書籍,而很少能找到介紹PHP的著作,正說明了國內(nèi)的這種流行趨勢(shì)。然而,過去一年中整個(gè)互聯(lián)網(wǎng)中PHP使用者穩(wěn)步增長的事實(shí),卻與這些觀點(diǎn)截然相反。我認(rèn)為那些不看重PHP的人至少忽略了以下幾個(gè)原因:
1. PHP已經(jīng)證明是非常實(shí)用的軟件,性能、可靠性、穩(wěn)定性非常高,借一個(gè)來自武俠小說的比喻,PHP就如同來自江湖下層一步步成名的草莽英雄,而商業(yè)軟件則如同出身高貴的少年俠士,其成名的原因與其師傅和門派密切相關(guān)。PHP具備各種數(shù)據(jù)類型并支持復(fù)雜的文本處理,它甚至支持面向?qū)ο?,能配置為處理XML等等;更為重要的是PHP的這些功能都是非常實(shí)用的,要知道PHP的開發(fā)者都是根據(jù)自己的需要自愿進(jìn)行的開發(fā),它具備的功能一定是有著實(shí)際用途的。雖不能說PHP比同類產(chǎn)品強(qiáng),但其實(shí)力不容忽視。
2. PHP是跨平臺(tái)的產(chǎn)品,它能運(yùn)行在多種Unix以及Windows NT上,并能訪問多種不同的數(shù)據(jù)庫,對(duì)很多人來講,這一點(diǎn)非常重要。商業(yè)產(chǎn)品通常要求非??量?,只能和特定的操作系統(tǒng)和數(shù)據(jù)庫相互協(xié)作。而人們喜歡使用自己已經(jīng)熟悉的操作系統(tǒng)、Web服務(wù)器和數(shù)據(jù)庫,如Linux、Apache和MySQL。
3. PHP是開放源代碼的軟件,很多人對(duì)此不以為然,然而他們忽視了占Web服務(wù)器市場(chǎng)58%的Apache服務(wù)器,忽視了Linux、FreeBSD等開放源代碼的操作系統(tǒng),這些開放源代碼的軟件結(jié)合在一起,就形成了一個(gè)非常有效的解決方案。
4. 即便不考慮源代碼的因素,PHP不需要任何費(fèi)用的特點(diǎn)也是商業(yè)軟件無法相比的。雖然ASP也是免費(fèi)的,然而很多人忽視了運(yùn)行Windows NT及MS SQL的費(fèi)用,而PHP和Linux/FreeBSD、Apache、MySQL相互合作,幾乎不需要任何軟件費(fèi)用,當(dāng)前如果不考慮盜版,究竟有多少人還會(huì)堅(jiān)持ASP呢?
5. PHP有良好的技術(shù)支持,可以通過電子郵件、論壇、網(wǎng)頁、IRC等方式獲得技術(shù)支持。這聽起來有些好笑,難道這比商業(yè)軟件的技術(shù)支持更有效嗎?事實(shí)上依我個(gè)人使用商業(yè)軟件和開放源代碼軟件的經(jīng)驗(yàn),這種技術(shù)支持形式相當(dāng)不錯(cuò),設(shè)想一下,你能夠得到來自ASP開發(fā)組的技術(shù)服務(wù)嗎?我想更常見的結(jié)果是在一通800電話之后,得到的只是一堆無用的建議,最后你終于厭倦了轉(zhuǎn)來轉(zhuǎn)去的電話。即便是現(xiàn)場(chǎng)服務(wù),也許是某個(gè)工程師在一遍又一遍地重裝系統(tǒng),直到系統(tǒng)偶然地運(yùn)行正常為止,這樣也好,系統(tǒng)管理員至少可以裝作什么都不懂的樣子稍事休息一下。而開放源代碼使你能提出更接近故障本質(zhì)的現(xiàn)象,不但遇到過同樣現(xiàn)象的使用者會(huì)提供幫助,PHP的開發(fā)者也能提供幫助。有什么技術(shù)支持比幾十萬個(gè)使用者,其中大多數(shù)都是使用PHP的老手,提供的幫助更有效呢。
無論如何,商業(yè)支持并不是一個(gè)軟件流行的必要條件,反過來倒是正確的,最近的例子Linux不就是由于流行而得到了商業(yè)支持的嗎?例如最新版本的網(wǎng)頁制作工具DreamWaver 3.0,也開始支持PHP的標(biāo)記,允許在其中直接進(jìn)行PHP代碼的編寫了。越來越多的國內(nèi)Web開發(fā)者也開始將目光投向PHP,其中大多數(shù)選擇了Unix (Linux,FreeBSD, Solaris, AIX, HP-UX等等)作為Web站點(diǎn)的操作系統(tǒng),而國內(nèi)出版計(jì)算機(jī)圖書的出版社也會(huì)陸續(xù)出版一些PHP的著作,顯然這又會(huì)有利于PHP的推廣和發(fā)展。