為什么PHP不適合于比小型業(yè)余網(wǎng)站更大的網(wǎng)站
2021-02-01
為什么用PHP開發(fā)大型系統(tǒng)感到不舒服?
來自:太平洋計(jì)算機(jī)網(wǎng)絡(luò)
在過去的四年中,作者一直致力于PHP應(yīng)用程序的開發(fā)。 PHP確實(shí)很容易編寫。但是PHP也有一些非常嚴(yán)重的缺陷。
以下作者將給出我自己的理由,為什么PHP不適合于比小型業(yè)余網(wǎng)站大的網(wǎng)站。
1.對遞歸的支持不佳
遞歸是一種函數(shù)調(diào)用自身的機(jī)制。這是一項(xiàng)強(qiáng)大的功能,可以使某些復(fù)雜的事情變得非常簡單。使用遞歸的一個(gè)示例是quicksort(quicksort)。不幸的是,PHP不擅長遞歸。 PHP開發(fā)人員Zeev說:“ PHP4.0(Zend)使用堆棧方法處理密集數(shù)據(jù),而不是使用堆方法。也就是說,與之相比,它可以容忍的遞歸函數(shù)數(shù)量有明顯的限制。其他語言。更少?!闭垍⒁婂e(cuò)誤1901。這是一個(gè)非常不好的借口。每種編程語言都應(yīng)提供良好的遞歸支持。
2.許多PHP模塊不是線程安全的
幾年前,Apache發(fā)布了Web服務(wù)器的2.版本0。該版本支持多線程模式,在這種模式下,軟件的一部分可以同時(shí)運(yùn)行多個(gè)。 PHP的發(fā)明者說,PHP的核心是線程安全的,但非核心模塊不是必需的。但是,十分之九,您想在PHP腳本中使用此模塊,但這使您的腳本不適用于Apache的多線程模式。這就是為什么PHP團(tuán)隊(duì)不建議在Apache 2的多線程模式下運(yùn)行PHP的原因。糟糕的多線程模式支持使PHP經(jīng)常被認(rèn)為是Apache 2仍然不受歡迎的原因之一。
請閱讀以下討論:Slashdot:網(wǎng)站拒絕Apache 2嗎?。
3.由于商業(yè)原因,PHP不健全
通過使用緩存,PHP的性能可以顯著提高500%[請參閱基準(zhǔn)測試]。那么為什么緩存沒有內(nèi)置在PHP中呢?由于PHP的制造商Zend正在出售自己的Zend Accelerator,因此,他們當(dāng)然不想放棄他們的商業(yè)產(chǎn)品。
但是還有另一種選擇:APC。 (Zend后來推出了Zend Optimizer,這是一個(gè)免費(fèi)的加速器-翻譯器)
4.沒有命名空間
想象一下有人制作了一個(gè)PHP模塊來讀取文件。模塊中的功能稱為讀取。然后,另一個(gè)人的模塊可以讀取網(wǎng)頁,該網(wǎng)頁還包含讀取的功能。然后,我們不能同時(shí)使用這兩個(gè)模塊,因?yàn)镻HP不知道您要使用哪個(gè)功能。
但是有一個(gè)非常簡單的解決方案,那就是名稱空間。曾經(jīng)有人建議將此功能添加到PHP5中,但不幸的是他沒有這樣做。現(xiàn)在,沒有名稱空間,并且每個(gè)函數(shù)都必須以模塊名稱作為前綴,以避免名稱沖突。這使函數(shù)名稱非常長,例如,xsl_xsltprocessor_transform_to_xml使得代碼難以編寫和理解。
5.非標(biāo)準(zhǔn)日期格式字符
許多程序員熟悉從UNIX和C語言派生的日期格式字符。其他一些編程語言也采用了此標(biāo)準(zhǔn),但奇怪的是,PHP具有自己的一組完全不兼容的日期格式字符。在C中,“%j”表示一年中的某天,而在PHP中,其表示每月中的某天。但是,要使情況更加混亂:Smarty(一種流行的PHP模板引擎)的strftime函數(shù)和date_format函數(shù)使用C / UNIX格式字符。
6.許可證混亂
您可能會(huì)認(rèn)為PHP是免費(fèi)的,并且手冊中提到的所有PHP模塊也是免費(fèi)的。錯(cuò)誤!例如,如果您想用PHP生成PDF文件,您將在手冊中找到兩個(gè)模塊:PDF和ClibPDF。但是這兩個(gè)都有商業(yè)許可證。因此,對于您使用的每個(gè)模塊,必須確保您同意他的許可。
7.函數(shù)命名規(guī)則不一致
某些函數(shù)名稱由多個(gè)單詞組成。通常有三種詞組合:
直接拼接:getnumberoffiles
下劃線分隔:get_number_of_files
駱駝法則:getNumberOfFiles
大多數(shù)語言選擇其中一種。但是使用PHP。
例如,如果要將某些特殊字符轉(zhuǎn)換為HTML實(shí)體,則將使用htmlentities函數(shù)(直接拼接詞)。如果要使用相反的功能,則必須使用其小兄弟html_entity_decode。由于某些特殊原因,函數(shù)名稱由下劃線分隔。怎么會(huì)這樣?您知道有一個(gè)名為strpad的函數(shù)。還是他是str_pad?每次您必須檢查該符號是什么時(shí),或者等待他犯錯(cuò)。函數(shù)不區(qū)分大小寫,因此PHP的rawurldecode和RawUrlDecode之間沒有區(qū)別。這也很糟糕,因?yàn)閮烧叨急皇褂貌⑶彝庥^不同php開發(fā)是什么,這會(huì)使讀者感到困惑。
8.魔術(shù)引號的地獄
魔術(shù)引號可以保護(hù)PHP腳本免受SQL注入攻擊。很好但是由于某些原因,您可以在php.ini中關(guān)閉此配置。因此,如果要編寫靈活的腳本php開發(fā)是什么,則始終必須檢查魔術(shù)參考是打開還是關(guān)閉。這樣的“功能”應(yīng)該使編程更容易,但實(shí)際上它變得更加復(fù)雜。
9.缺乏標(biāo)準(zhǔn)框架
一個(gè)沒有整體框架的成長中的網(wǎng)站最終將成為維護(hù)的噩夢??蚣芸梢允购芏喙ぷ髯兊萌菀?。最受歡迎的框架模型是MVC模型,其中表示層,業(yè)務(wù)邏輯和數(shù)據(jù)庫訪問均分開。
許多PHP網(wǎng)站都不使用MVC模型。他們甚至沒有框架。即使現(xiàn)在有一些PHP框架,您也可以自己編寫。有關(guān)PHP的文章和手冊并未改進(jìn)該框架。同時(shí),JSP開發(fā)人員使用Struts等框架,而ASP開發(fā)人員使用.Net。這些概念似乎已被PHP開發(fā)人員廣泛理解。這說明了PHP實(shí)際上是多么專業(yè)。
摘要
出什么問題了?
對于非常小的項(xiàng)目,它可能是一種非常令人滿意的編程語言。但是對于更大,更復(fù)雜的項(xiàng)目,PHP表現(xiàn)出了它的弱點(diǎn)。繼續(xù)探索之后,您將找到作者提到的一些問題的解決方案。因此,當(dāng)解決方案已知時(shí),為什么不能更正呢?另外,為什么手冊中未提及這些修復(fù)程序?
開源語言非常流行是一件好事。不幸的是,這不是一門好語言。作者希望所有問題都能在一天之內(nèi)解決(也許在PHP6中?),然后我們將擁有一種既開源又易于使用的開源語言。
到目前為止,當(dāng)您要啟動(dòng)一個(gè)包含5個(gè)以上腳本頁面的項(xiàng)目時(shí),最好考慮使用C#/ ASP.Net或Java / JSP,或者也許Python也是更好的選擇。