PHP 與 ASP.NET 正面交鋒
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
如今當(dāng)提到 Web 開發(fā)時,您有許多選擇。這些方法中許多都涉及到預(yù)處理 — 即,利用特定的標(biāo)記將代碼嵌入到 HTML 頁面中,這些標(biāo)記告訴預(yù)處理器,它們包含代碼,并且應(yīng)對它們作出處理。與 CGI 非常相似,這些代碼在服務(wù)器上運行,并返回一些內(nèi)容,這些內(nèi)容表現(xiàn)為發(fā)回給瀏覽器的結(jié)果 HTML 頁面的部分外觀。開放源代碼腳本語言 PHP 和 Microsoft 的 ASP.NET 框架中的語言都屬于這種類型;JavaServer Pages (JSP) 和 Perl/Mason 也以這種方式運行。 在本文中,我將重點講述 PHP — Oracle 已選擇合并到其產(chǎn)品中的技術(shù) — 和 ASP.NET。我將概述兩者的各種優(yōu)勢和弱點,并著重討論那些將幫助您決定開發(fā)項目應(yīng)選擇哪種技術(shù)的因素。有很多因素需要考慮,不同的項目可能訴諸于不同的技術(shù)??傊?,您將看到在價格、速度和效率、安全性、跨平臺支持等方面的逐項比較,以及開放源代碼解決方案的優(yōu)勢。 什么是 ASP.NET? ASP 最新的版本 ASP.NET 并不完全與 ASP 早期的版本后向兼容,因為該軟件進(jìn)行了完全重寫。早期的 ASP 技術(shù)實際上與 PHP 的共同之處比與 ASP.NET 的共同之處多得多,ASP.NET 是用于構(gòu)建 Web 應(yīng)用程序的一個完整的框架。這個模型的主要特性之一是選擇編程語言的靈活性。ASP.NET 可以使用腳本語言(如 VBScript、JScript、Perlscript 和 Python)以及編譯語言(如 VB、C#、C、Cobol、Smalltalk 和 Lisp)。新框架使用通用語言運行環(huán)境 (CLR);先將您語言的源代碼編譯成 Microsoft 中間語言代碼,然后 CLR 執(zhí)行這些代碼。 這個框架還提供真正的面向?qū)ο缶幊?(OOP),并支持真正的繼承、多態(tài)和封裝。.NET 類庫根據(jù)特定的任務(wù)(例如,使用 XML 或圖像處理)組織成可繼承的類。 除了編程語言和方法之外,數(shù)據(jù)庫訪問也是要著重關(guān)心的一個因素。當(dāng)您用 ASP.NET 編程時,可以用 ODBC 來集成數(shù)據(jù)庫;ODBC 提供了一組一致的調(diào)用函數(shù)來訪問您的目標(biāo)數(shù)據(jù)庫。 優(yōu)勢和弱點 ASP.NET 的優(yōu)勢很明顯在于它簡潔的設(shè)計和實施。這是面向?qū)ο蟮木幊倘藛T的夢想:語言靈活,并支持復(fù)雜的面向?qū)ο筇匦?。在這種意義下,它真正能夠與編程人員現(xiàn)有的技能進(jìn)行互操作。 ASP.NET 的另一個優(yōu)勢是其開發(fā)環(huán)境。例如,開發(fā)人員可以使用 WebMatrix(一個社區(qū)支持的工具)、Visual Studio .NET 或各種 Borland 工具(如 Delphi 和 C++ Builder)。例如,Visual Studio 允許設(shè)置斷點、跟蹤代碼段和查看調(diào)用堆棧??偠灾?,它是一個復(fù)雜的調(diào)試環(huán)境。許多其他第三方的 ASP.NET IDE 解決方案也將必然出現(xiàn)。 但您得到了強健性,就將以損失效率為代價。ASP.NET 在內(nèi)存使用和執(zhí)行時間方面耗費非常大,這大部分歸因于較長的代碼路徑。對基于 Web 的應(yīng)用程序,這些局限可能是一個嚴(yán)重的問題,因為在 Web 上,您的應(yīng)用程序可能擴展為每秒成千上萬的用戶。內(nèi)存使用率還可能成為 Web 服務(wù)器上的一個問題。 什么是 PHP? PHP 是基于預(yù)處理 HTML 頁面模型的一種腳本語言。當(dāng) Web 服務(wù)器中的 PHP 預(yù)處理器發(fā)現(xiàn)像下面這樣的 PHP 語言標(biāo)記時,將調(diào)用 PHP 引擎來執(zhí)行該代碼: some code here ?> 任何使用過命令式編程語言的編程人員都會對 PHP 非常熟悉;您會發(fā)現(xiàn)它與 Perl、C 和 Java 在語法上的相似處。嚴(yán)格來講,Java 是一種命令式編程語言,但它也利用了面向?qū)ο蟮慕Y(jié)構(gòu)和概念。PHP 在適宜的時候借鑒了這種結(jié)構(gòu),但它不是一種純粹的 OOP 語言。 在上面對 ASP.NET 的討論中,我提到了 ODBC 驅(qū)動程序,以及在考慮數(shù)據(jù)庫抽象的情況下如何構(gòu)建應(yīng)用程序。在 PHP 中,您也可以使用 ODBC 與數(shù)據(jù)庫對話,因此您已經(jīng)有了一系列支持的數(shù)據(jù)庫可供選擇。也有 MySQL、Oracle 和 Postgres 的原生驅(qū)動程序。此外,如果要使用 Oracle,則有一個特殊的 OCI8 庫將提供對 Oracle 更多訪問功能,從而允許您使用諸如 LOB、BLOB、CLOB 和 BFILE 之類的特性。 這時您可能會問“為什么與數(shù)據(jù)庫相關(guān)的資料庫被稱為 PHP 的特性?”數(shù)據(jù)庫抽象或獨立性是您在設(shè)法構(gòu)建使用多種數(shù)據(jù)庫或需要在數(shù)據(jù)庫間移植(例如,從開發(fā)到投產(chǎn)時的移植)的應(yīng)用程序時所要考慮的一個因素。而這些確實是應(yīng)該關(guān)心和考慮的。 但正如 Tom Kyte 在他的新書 — Effective Oracle by Design (Oracle 出版社) — 中指出的那樣,數(shù)據(jù)庫相關(guān)性將成為您真正的目標(biāo),因為這將使您在該技術(shù)中的投資最大化。如果您對 Oracle 進(jìn)行一般的訪問 — 無論通過 ODBC 或 Perl 的 DBI 庫,那么您將無法使用其他數(shù)據(jù)庫所不具有的特性。此外,優(yōu)化查詢在各個數(shù)據(jù)庫中各不相同。 Zend Technologies 是一家商業(yè)軟件公司,它對 PHP 作出了重大貢獻(xiàn)。它創(chuàng)建了一個稱為 Zend Studio 的商業(yè)開發(fā)環(huán)境,這個環(huán)境包含了一個復(fù)雜的調(diào)試器、一個監(jiān)測器和其他特性。該公司還構(gòu)建了免費的 Zend Optimizer,它與 Zend Encoder 結(jié)合使用來編譯 PHP 代碼,以提升性能。還有其他商業(yè)產(chǎn)品,如 Zend Performance Suite,它可以緩存預(yù)編譯的 PHP 頁面,從而進(jìn)一步顯著提升總體性能。 優(yōu)勢和弱點 到測試版 4 為止,PHP 5 仍然有一些缺點,包括缺少異常和基于事件的錯誤處理例程 — 它們能夠中斷正常的程序流,并將代碼跳轉(zhuǎn)到一個特殊的錯誤處理部分。Java 也提供了用于錯誤處理的異常,而 C++ 通過 try、catch 和 throw 語法提供異常處理。當(dāng)然,您仍然可以在 PHP 中管理錯誤,但其結(jié)構(gòu)不是標(biāo)準(zhǔn)化的,因而使得編程人員必須使用自己的工具來決定執(zhí)行錯誤處理的方式,這將導(dǎo)致更低的一致性并往往導(dǎo)致推倒重來。 另一個弱點是 PHP 的函數(shù)名是不區(qū)分大小寫的。雖然這不是一個嚴(yán)重的缺點,但有些程序員可能會覺得這一特性很討厭。 不過,我的確對 PHP 的對象模型心存疑慮。PHP 不是專門設(shè)計為一種面向?qū)ο蟮恼Z言。這些特性中的一部分是后來添加的 — 盡管注意了保持與 PHP 3 的后向兼容性,因此兩種模型的特性都留有一些。實際上,在 PHP 5 中這些弱點中的許多都得到了解決。請留心關(guān)注。 PHP 在一些領(lǐng)域中缺少什么,它就會在擅長的領(lǐng)域中迅速地彌補什么。價格合理,因此您不需要擔(dān)心許可問題。它也是開放源代碼的,因此整個社區(qū)將密切關(guān)注開發(fā)過程:發(fā)現(xiàn)錯誤并將其修復(fù)。如果有一個特性您不喜歡,那么您可以修改代碼。此外,PHP 可與 Apache 自然結(jié)合:它可以作為一個模塊編譯,或直接編譯成 Apache 二進(jìn)制文件。 但在 Apache 上運行意味著,利用 PHP,您能夠利用您已經(jīng)在任意服務(wù)器投資,這是因為 Apache 能夠運行在 Windows、Linux、Solaris 和各種其他 Unix 平臺上。此外,使用擁有 Apache 的跟蹤記錄的 web 服務(wù)器意味著安全性能夠保持在最高的優(yōu)先級上。最后,PHP 擁有更小的代碼路徑,這意味著更少的分析和執(zhí)行 PHP 頁面服務(wù)器端代碼,這將帶來更高效的內(nèi)存和使用率以及更快的運行。 在 PHP 5 中新增了哪些特性? PHP 5 的第 4 個測試版在 2003 年 12 月底推出,更改日志清楚地顯示已發(fā)現(xiàn)許多錯誤并已將其消除。雖然它仍在進(jìn)行測試,但它的所有新特性和進(jìn)步都確實值得關(guān)注。 PHP 5 的主要新成就在于它的異常處理和一個新對象,這個新對象引入的特性賦予了 PHP 真正的 OOP。異常處理無疑是 PHP 4 中最顯著的缺憾之一,而 PHP 5 對異常處理的引入無疑是一個成熟的標(biāo)志。異常處理意味著您在您的軟件中擁有了根據(jù)語言定義的和標(biāo)準(zhǔn)化的錯誤處理方法。只需使用 try、catch 和 throw 方法,您的 PHP 代碼就變得更加強健和簡潔。 class blue { function openFile ($inFile) { if (file_exists ($inFile)) { # code to open the file here } else { throw new Exception ("Cannot open file:$inFile"); } } } $blueObj = new blue (); try { $blueObj->openFile ('/home/shull/file.txt'); } catch (Exception $myException) { echo $myException->getMessage (); # rest of exception handling code here } # rest of blue methods here ?> 新的對象模型為用 PHP 編寫的程序帶來許多積極的影響。在 PHP 4 中,當(dāng)把將一個對象傳遞給函數(shù)或方法時,是通過值來傳遞的 — 除非您另行顯式告知 PHP。這個過程意味著必須復(fù)制對象的一個副本(內(nèi)存中的所有數(shù)據(jù)結(jié)構(gòu))。這個步驟使用內(nèi)存,使得訪問變慢和擁塞。而在 PHP 5 中,通常通過引用傳遞對象。 PHP 5 中新的面向?qū)ο蟮奶匦裕ò?gòu)造器和析構(gòu)器)值得關(guān)注。與 C++ 和 Java 相同,它們提供了一種標(biāo)準(zhǔn)方法,即通過一個構(gòu)造器方法來創(chuàng)建對象、分配內(nèi)存和執(zhí)行任何必要的設(shè)置,并通過一個析構(gòu)器方法來執(zhí)行清理。 PHP 5 還引入了對類中方法和變量的更精細(xì)控制。在 PHP 4,一切都是公有的:您可以從類外或在繼承類中訪問您類中的變量。在 PHP 5 中,您仍然可以使變量或方法為公有,但您也可以使它們?yōu)樗接?,以使得只能在類本身中使用它們。還可以將它們保護起來,也就是說,可以在類內(nèi)或在子類中查看方法和變量。 此外,PHP 5 引進(jìn)了類型提示或更好的類型檢查。當(dāng)您將一個對象傳遞給一個例程時,PHP 能夠檢查它是否是正確的類型,并在檢查失敗時產(chǎn)生類型不匹配錯誤。 由于還有其他特性(如靜態(tài)方法和變量以及抽象類),因此請務(wù)必查看文檔,以獲取詳細(xì)信息。 安全性比較 ASP.NET 官方要求您使用 IIS。不幸的是,IIS 易受攻擊的歷史由來已久,這使得許多管理員不愿意部署它來處理 Web 站點。這些弱點是因為 Microsoft 的缺陷或是因為 IIS 是黑客們攻擊的目標(biāo)無關(guān)緊要:這些系統(tǒng)有被黑或被攻擊的歷史。PHP 也運行在 Apache 上,Apache 快速并且是開放源代碼的,并擁有很好的安全性記錄。此外,正如我提到過的,Apache 可以在許多平臺上運行。 如果您在考慮 ASP.NET,但您想用 Apache 作為 Internet 門戶,那么很幸運您可以有一些選擇。首先,您可以使用 Apache 將請求轉(zhuǎn)發(fā)給在另一臺計算機上內(nèi)部運行的 IIS。然后 Apache 處理靜態(tài)內(nèi)容,并將 aspx 內(nèi)容傳送給 IIS 服務(wù)器(不暴露給 Internet)。 不過,如果您想利用 Apache 承載 ASP.NET,那么提供了一些選項,這些選項 Microsoft 可能支持也可能不支持。作為最后一種選擇,有 Ximian 的 Project Mono,它致力于構(gòu)建一個開放源代碼模塊。請瀏覽 www.go-mono.com,以獲取更多信息。 數(shù)據(jù)庫編碼示例 您在選用 PHP 或 ASP.NET 時首先要考慮因素之一就是與數(shù)據(jù)庫的連接。不過,利用 ASP.NET 更復(fù)雜,因為您可以從許多備選語言中選擇任意一種語言。當(dāng)然,這些代碼示例將必須嵌入到 HTML 頁面、實例化的類等之中。不過,以下信息將使您對二者的編碼風(fēng)格有所了解。 PHP 5 與 Oracle 連接 下面是一個 PHP 5 類,它提供了一個 Oracle 連接和斷開例程,用以演示利用 PHP 5(也可以使用其他驅(qū)動程序(如 ODBC 驅(qū)動程序)和通用的數(shù)據(jù)庫接口)與 Oracle 連接的一種方式: class oracle_object { protected $theDB; protected $user; protected $pass; protected $db; function __construct($u, $p, $d) { $this->user = $u; $this->pass = $p; $this->db = $d; } function db_open () { $theDB = @OCILogon($this->user, $this->pass, $this->db); db_check_errors($php_errormsg); } function db_close() { @OCILogoff($theDB); db_check_errors($php_errormsg); } function __destruct () { print ("so long..."); } } ASP.NET 與 Oracle 連接 如果您希望利用 VB.NET(Visual Basic 是 Microsoft 的默認(rèn) .NET 編程語言)與 Oracle 連接,那么請看一下這個來自 MSDN 的示例: Imports System Imports System.Data Imports System.Data.OracleClient Imports Microsoft.VisualBasic Class Sample Public Shared Sub Main() Dim oraConn As OracleConnection = New OracleConnection ("Data Source=MyOracleServer;Integrated Security=yes;") Dim oraCMD As OracleCommand = New OracleCommand ("SELECT CUSTOMER_ID, NAME FROM DEMO.CUSTOMER", oraConn) oraConn.Open() Dim myReader As OracleDataReader = oraCMD.ExecuteReader() Do While (myReader.Read()) Console.WriteLine(vbTab & "{0}" & vbTab & "{1}", myReader.GetInt32(0), myReader.GetString(1)) Loop myReader.Close() oraConn.Close() End Sub End Class 作出選擇 假定您還沒有決定選用 PHP,我可以斷言 PHP 的優(yōu)勢遠(yuǎn)遠(yuǎn)超過它的弱點。(請參見表 1 中的概要。)這些優(yōu)勢歸結(jié)為價格、速度和效率、安全性、跨平臺適用性和開放源代碼機遇。它惟一的弱點是缺少一種純粹和完美的 OOP 實現(xiàn),不過,這是一個很小的缺點。雖然語言結(jié)構(gòu)的確有幫助,但好的編碼最終是由實踐、執(zhí)行、好的習(xí)慣和規(guī)范帶來的。 表 1 PHP 4 PHP 5 ASP.NET 軟件價格 免費 免費 免費 平臺價格 免費 免費 $$ 速度 強 強 弱 效率 強 強 弱 安全性 強 強 強 平臺 強 強 弱(僅用于 IIS) 平臺 任意 任意 win32(僅用于 IIS) 是否提供源代碼 是 是 否 異常 否 是 是 OOP 弱 強 強 價格。在此,我們不應(yīng)簡單地考慮初始投資 — 對 PHP 而言,這很明顯是免費的 — 還應(yīng)考慮實施、維護和調(diào)試的成本。對 PHP 而言,您可能需要購買 Zend 優(yōu)化引擎。然而,使用 ASP,您將從一開始就進(jìn)行投資,而且您還要為附加的技術(shù) — 例如,執(zhí)行圖形處理的庫 — 支付費用。但從長遠(yuǎn)來看,PHP 將不會逼迫您升級并向您收取更多的許可費用。接觸過復(fù)雜許可的每一個人都知道,很多公司花費大量的時間和金錢僅是為了確保其順應(yīng)性。此外,當(dāng)在獲得錯誤修復(fù)的時間上,您得到的反應(yīng)也有所不同。這當(dāng)然將轉(zhuǎn)化成時間,時間又將轉(zhuǎn)化成總體開發(fā)的成本。 速度和效率。正如我先前提到的,ASP.NET 是一個允許您使用各種編程語言的框架。此外,它據(jù)稱擁有一個極好的面向?qū)ο竽P?。盡管所有這些都是真的,但在考慮到速度時,它卻是不利的?;谝陨显?,在 ASP.NET 中運行 ASP 頁面與在 PHP 引擎中運行等效的 PHP 頁面相比需要執(zhí)行更多代碼。PHP 是一種“快速粗糙”的解決方案,是為完成工作而設(shè)計的解決方案。雖然自 2.0 和 3.0 版本以來為其增強了許多強健性,但它仍然保留著核心的優(yōu)化的高速方法。 速度不是惟一要考慮的因素。內(nèi)存使用率也很重要。 安全性。ASP.NET 運行在 IIS 上,而 IIS 已被攻擊了無數(shù)次 — 正如每隔一周的 IT 新聞報告所證實的。它已經(jīng)成為這樣一種負(fù)擔(dān),實際上,盡管其耗巨資進(jìn)行銷售宣傳,但許多 IT 專業(yè)人員仍然拒絕用 IIS Web 服務(wù)器來開放他們的網(wǎng)絡(luò)。而 PHP 使用 Apache。Apache 擁有已被證明的速度、可靠性和穩(wěn)固的安全性的記錄。請瀏覽 www.securityfocus.com,以獲取更多信息。 跨平臺適用性。ASP.NET 在 IIS 上運行,并且開始在 Apache 上運行(Apache 能夠在許多平臺上運行)。PHP 從一開始就設(shè)計用于和 Apache 一起工作,因此您擁有許多可供選擇的已被證明和可靠的服務(wù)器平臺。 開放源代碼機遇。開放源代碼并不只靠一些異想天開的編程人員或想要節(jié)省一些許可費用的公司來開展。當(dāng)您處理軟件本身的錯誤時,開放源代碼可能成為真正的天賜之物。 在使用 PHP 或 ASP.NET 的情況下,您都會有一個大的用戶群,他們使用軟件并且可能遇到錯誤。使用 ASP.NET,這些錯誤必須通過一個官方程序來通知、修復(fù)、測試,并在一個新的補丁或版本中消除。然而,PHP 補丁可以快速地得到修補并發(fā)布。目睹開放源代碼發(fā)展的任何人都知道,新的版本和補丁通常在幾天內(nèi)而不是像商業(yè)軟件一樣在幾個星期或幾個月內(nèi)推出。如果這不夠快,那么您通??梢宰约簛硇扪a問題(如果必要的話)。 關(guān)于作者 Sean Hull 是 iHeavy Inc.公司的高級顧問,該公司位于紐約市。他專注于開放源代碼技術(shù)與商業(yè)技術(shù)(如 Oracle)的集成,并已服務(wù)于多家成功的紐約公司。
該文章在 2012/4/2 19:41:56 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |