1.應用範圍仍然有限

來源:互聯網
上載者:User
大型系統上PHP不稱職的六個理由(拍磚激辯中)

本文發出後,確實引起不少的爭議。看來PHP的支援者不少啊。但是,從一個側面來審視PHP,也未嘗不可。

從php3到php4到PHP5,再到PHP6,PHP確實越來越完善,功能也更強大。PHP為一開放源碼項目,其中包括可以簡化程式的描述性語言引擎以及一個大的連結庫,也有專門開發PHP的公司,如Zend就有銷售PHP套裝產品、程式撰寫工具及支援人員服務。尤其是跨平台的使用特性將使它在linux平台大放異彩。可以直接使用java的類庫,可以直接調用perl/c等語言寫的程式增強了它的可擴充性。越來越成熟的MVC開發架構使它能適應企業級的大型應用開發。再加上它天生強大的資料庫支援能力。確實博得了很多使用者的喝彩!

不過,這裡倒是想從側面來看看PHP也許不稱職的幾個理由。

1.應用範圍仍然有限

與Java相較,PHP可用範疇限制較多,它僅能用在網路伺服器上,不像Java,同時可用在網路伺服器、個人電腦、手機、晶片卡或其它裝置。記得有個老友陳述放棄php的原因:“第一:每個變數前面要寫一個$符號;?? 第二:因為不是編譯執行的方式;? 第三:物件導向的功能不強。”比如,php的oop運行一次就退出,下次還要繼續重建o,繼續繼承....。注意是每一次請求,它不能利用上一次的結果,下一次用還要從頭初始化。許多問題的根源還在於apache。

再一個:“可能目前php?? IDE不是很好,給別人入門難的感覺。”儘管新版本增加了物件導向功能,但相比成熟的Java,仍然有許多待改進之處。以至於有人這麼歸納: (1)缺乏廣泛的使用,以至於微軟也要和大家討論PHP到ASP.Net的遷移。(2)缺乏大公司的支援,象IBM的開發中心開源項目首頁上的6個標題中,PHP只有3個。 (3)缺乏重量級的應用,象Google和Yahoo用PHP(不是所有的產品)都是瞎玩。當然,我知道Taobao.com也是PHP做的。

2.調試還是不太方便

在apache上的進程工作模式。 apache處理每一個php請求,都要建立一個子進程,這樣的話實現串連池比較困難了,進程間的資料共用一般只能通過檔案,資料庫什麼的完成,各項開銷比較大,當然速度並不低。

還是陳述一個網友的發言:“沒有好的開發工具,調試起來過於複雜。雖然zend不錯,但是哪裡是VS的對手。沒有強大的Visual 開發工具,換句話,如果有了,我絕對選擇PHP。”這好像是和Java早期比較類似的一個情形。也許,在不遠的未來,我們會看到很好的調試工具。問題是:現在還沒有太稱心的,尤其是大型系統上。

還有個問題,就是共用記憶體的使用,我就不知道為什麼直接使用php操作共用記憶體就這麼複雜,而且速度居然比直接操作磁碟檔案還慢。

3.主流版本的安全性漏洞百出

看一個最近的新聞,和Php pdflib擴充繞過open_basedir安全限制漏洞有關。受影響系統:PHP PHP 5.3.0。PHP所使用的PDFLib擴充沒有正確的強制基礎PHP配置指令,這允許攻擊者繞過open_basedir限制在非授權位置寫入檔案。僅在多個使用者可以建立和執行任意PHP指令碼代碼的共用託管配置中才會出現這個漏洞。在這種情況下,open_basedir限制應彼此隔離使用者。

PHP V6 在添加一些新特性的同時,也刪除了以前版本中的一些函數和特性。被刪除的大部分東西,比如 register_globalssafe_mode,在當前的 PHP 中都被廣泛認為是 “有漏洞的”,因為它們可能招致安全風險。當然,PHP的配置非常靈活,可以通過php.ini, httpd.conf, .htaccess檔案(該目錄必須設定了AllowOverride All或Options)進行設定,還可以在指令碼程式裡使用ini_set()及其他的特定的函數進行設定。通過phpinfo()和get_cfg_var()函數可以得到配置選項的各個值。

4.大型系統的穩定性與一種語言的風格

有人這麼說(也是一個PHP讀者的疑問):“大型系統還是用.net或者jsp吧,不是因為php不可靠,是因為開發php的人良莠不齊,而php的開發模式又不固定,以你問這問題的情況來看,如果是多人開發,你肯定控制不好。.net或者jsp相對來說比較容易控制,可以讓程式結構清晰,二次開發或者更換程式員都不會有太大問題。”

老牌電腦作家Bruce Eckel也這麼說:“你經常會發現很多使用PHP編寫出的代碼錯誤百出,但這些代碼往往卻被人們互相拷貝,卻沒有人去認真分析研究它們。這些代碼通常是由那些習慣互相借鑒拷貝代碼的程式員所編寫,這些代碼品質低劣的原因是這些程式員通常不習慣問為什麼,不喜歡弄清楚原理,只管拿來就用。”為了讓大家可信,我放出他的相片吧。

?

很自然,作為普通讀者,會產生一個焦點問題:PHP到底有沒有前途?你說有前途是把,再秀幾點理由?

5.PHP的解釋運行機制

也許有經驗的PHP程式員最感到痛苦的地方是PHP的解釋運行機制。這種運行機制使得每個PHP頁面被解釋執行後,所有的相關資源都會被回收。也就是說,PHP在語言層級上沒有辦法讓某個對象常駐記憶體。在PHP中,所有的變數都是頁面級的,無論是全域變數,還是類的靜態成員,都會在頁面執行完畢後被清空。以JSP為例,在JSP中,Java Bean的scope有四種有效值:Page、Application、Session、Request,分別對應頁面、程式、會話、請求四種生存期。但在PHP中,只有Page一種生存期。

在PHP中,如果需要在頁面之間共用資料,需要手動將變數儲存到預定義的全域變數$GLOBALS或$_SESSION中。PHP會將這些變數儲存在某個檔案中,以便下次執行頁面時讀取。但是,這種方式存在著極大的限制,除了效率的低下外,它還無法儲存引用外部資源的變數,例如檔案、Socket、資料庫連接等,而正是這些資源最需要被緩衝。

這導致了許多進階的模式和技術無法使用。例如,即使是最簡單的Singleton模式也無法在PHP中被應用。雖然可以使用PHP寫出Singleton的代碼,但是由於PHP中沒有真正全域的static變數,所以每次頁面被執行時,都會重建立立新的對象,這樣也就完全失去了Singleton的意義。這也導致複雜的OR Mapping技術難以應用,因為沒有對象的緩衝機制,OR Mapping的開銷已經使這種技術失去了意義。

6.前途未蔔,開源的商業模式到底能撐多久?

對於從事PHP開發的同志們來說,Mysql的重要性是顯而易見的。還是老牌電腦作家Bruce Eckel的一個觀點:PHP主要是與資料庫搭配使用,資料庫來處理所有一致性問題,因此多數人只關心從資料庫中存取資料,而不用再去必須考慮底層的問題。但是這個語言不僅僅可以處理與資料庫互動的上層問題,同樣也可以實現與檔案系統之間互動的底層問題。我的感覺是,在PHP社區中多數人只關心如何得到一個好的結果,而沒有多少人關心它的真正實現原理,因此才出現了這種錯誤的傾向。

再看一個新聞(2008-1-21 ):國外媒體今天發表分析文章稱,Sun之所以斥資10億美元收購開放原始碼軟體公司MySQL,主要是為了進軍Web2.0軟體市場。Sun周三宣布,該公司已經同MySQL達成最終協議,將以10億美元收購這家開放原始碼軟體廠商。從交易價值來看,這是迄今為止開放原始碼領域最大的交易,其規模甚至接近之前所有開放原始碼交易的總和,包括紅帽以3.26億美元收購JBoss,Citrix以5億美元收購XenSource,以及雅虎以3.5億美元收購Zimbra。

在《Sun總裁部落格:我們為什麼收購MySQL》一文中,Sun總裁提出:除了要收購 MySQL,Sun 將提出面向 MySQL 市場的全球支援解決方案。我們將同時在社區和市場兩方面注入資金 —— 以加速本行業由專屬技術階段向開放式網路平台階段轉化的進程。並認為:新創公司和網路公司的 CTO 不同意使用收費的非開源產品。他們需要也想要擷取原始碼以實現最佳化和快速解決問題(儘管他們樂於對其認為有價值的支援服務付費)。另一方面,更多傳統 CIO 不同意使用不受商業關係背景支援的產品—— 因為他們更放心借 Sun 供應商之手來管理全球性業務和關鍵基礎架構。

仔細分析一下吧。還是那句老話,你也許認為PHP是免費的,所有的在手冊中提到的PHP模組也是免費的。但是,如同一個有生命力的產品一樣,免費的東西,也許會有很多理念的不統一。

?

< type="text/javascript">< type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">

?

一個晚上,評論無數。反對的意見也不是不接納,這裡先展示一個老友的反駁意見:

? 1.?? 物件導向不足??
? 如果你使用過PHP 5的話,你就不會這樣說了,你所想到的東西:存取權限(public/private)、繼承、抽象類別、介面、複製、序列化、自動垃圾收集、靜態成員、強大的異常處理...??
? 可以說基本上常見的物件導向的東西都有了,不要以為php5很遙遠,其實目前有很多人、很多項目都在使用PHP 5,你最好自己嘗試一下看看。??
? 建議參考:??
? http://www-128.ibm.com/developerworks/cn/opensource/os-phpobj/??
? http://www-128.ibm.com/developerworks/cn/opensource/os-advphpobj/??
? 2.?? 變數名前面加?? $???
? 這個只能算是一個小問題,是PHP告訴大家這是PHP獨特特徵的地方,PHP不是Java,不是C++,它是從開源世界走出來的指令碼語言,有了$,我覺得很親切,很棒。??
? 3.?? 不是編譯執行??
? 這個當然比不上CGI了,如果你用C寫CGI的化,但是我想,PHP的執行速度不會比JSP差到哪裡去的吧,也不會比ASP慢。另外,Zend有相關的商業工具來作類似於編譯的工作。??
? 4.?? PHP太靈活??
? 我想,誰都比較喜歡能夠自由控制的語言,這樣才能體現程式員的技術,當然,靈活也會帶來很多問題,比如很容易出錯,而且不容易找到,對於初學者的代碼可能會寫的很糟糕。但是,這就是PHP呀,這才是我們心目中開源的、自由的、高效的PHP??
? 5.?? 沒有MVC架構??
? 呵呵,如果你使用過?? phpCake、Zend?? frame的話,我想你不會說沒有架構,只是成熟程度的問題,其實Cake和Zend?? frame都非常棒,當然,另外一些象?? Prado、phpMVC等架構也是值得一提的??
? 參考:http://framework.zend.com/、http://cakephp.org/??
? 6.?? 沒有好的IDE??
? PHP的特點就是簡單,容易開發,你可以使用記事本,vi,也可以使用Editplus、UE,同樣也可以使用Nu、Zend等等工具,選擇很大,其實不要跟VS2003比較,因為他們不是一個東西,VS是個統一開發平台,PHP只是一門指令碼語言,使用Zend已經足夠了,至少我是這麼覺得。??
? 7.?? 擴充不容易寫??
? 呵呵,我想ASP的com也不是那麼好寫的,JSP裡面的JavaBeans也不是那麼簡單的,沒有很容易的事情,簡單或者複雜程度取決於你對一項事務的認識程度。如果你C學的好,你就不會覺得擴充不好寫。當然,相對來說,用C寫PHP擴充是稍微有點複雜,不過,因為複雜,所以你才能靠寫擴充拿高薪呀,呵呵。??
? 建議參考:《PHP程式設計》第十四章[擴充PHP]??
? 8.?? 調試不方便??
? 我不知道怎樣算是調試方便,如果你使用過ruby、perl寫cgi,你會知道什麼是調試不方便。如果你喜歡寫C,使用GDB之類的命令列工具,你會知道什麼是不方便。當然了,相對來說,你使用好的IDE,調試的工作量會減少很多的。?

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.