古詩詞大全網 - 藝術簽名 - 為什麽PHP被認為是草根語言?

為什麽PHP被認為是草根語言?

自PHP誕生以來,PHP就壹直服務於Web應用中的程序員。同時,PHP作為壹種為Web開發量身定制的腳本語言,壹直秉承著簡潔、開源的思想,使得PHP得以快速發展,有力地推動了Web2.0的產生和發展,但長期以來,PHPer(PHP程序員)壹直被視為基層程序員,技術含量較少,水平較低。這在中國尤為突出。

我記得有個技術總監說過這樣的話。他把PHP的開發任務分配給壹個程序員,沒想到那個程序員說:“我是Java出來的,妳讓我寫PHP。妳不是在貶低我嗎?”。這件事給我的印象很深,對我的觸動很大。雖然這不代表大部分程序員的觀點,但應該有相當壹部分人是這麽想的。還有人說,如果現在是大型政府項目,肯定不會考慮PHP。

那麽為什麽PHPer會被認為是草根呢?是因為簡單,大家都能學,所以不難嗎?我以前也這麽認為。PHP上手快,處理文件、數據、遠程連接、網絡編程都非常方便。還有壹種官方說法是學習PHP的成本很低,可以輕松使用。這種想法也很普遍,甚至大部分PHPer自己也這麽認為。

說到這裏,我想大家都會思考我為什麽要寫這些文字。因為壹年多對PHP的推廣讓我了解了很多使用PHP的公司。在這些過程中,我逐漸認識到了根本原因。我這裏說的是根本原因,雖然是我個人的看法,但是我覺得就是這個道理。

那麽為什麽PHPer會被視為草根階層呢?根本原因是PHPer做的大部分事情(通過代碼實現)都是表示層的事情,熟悉PHP的人都知道。當然也會有PHP會講用MVC結構寫的某個框架的功能。但是這些仍然是表示層。所以只和表示層打交道的程序員都算是草根。其實也確實如此,因為這種情況下PHP真的很難構造大規模的應用。

這就是為什麽,不會,為什麽PHPer總是負責表示層?答案是底層的數據處理(Web應用就是數據存儲和搜索)我們壹般不接觸。好了,這裏可能有人想到了。那不是數據庫嗎?沒錯,就是數據庫。把PHPer留在基層的罪魁禍首是數據庫。為什麽?

PHPer太依賴MySQL了。

因為在目前流行的web架構中,前端是負載均衡系統,中間是web服務器,後端是數據庫服務器。因此,大多數PHPer工作在Web服務器級別。因為數據庫很好地為我們組織了數據。所以PHP裏的算法不多,大家潛意識裏都覺得沒必要,更何況會影響性能。

在這種情況下,PHPer成為壹個數據庫用戶,他總是在操作數據庫。而不是做壹個程序。最簡單的PHP腳本之壹就是連接數據庫,取出數據,然後用命令輸出到瀏覽器。整個過程不超過10行代碼。給人的感覺太簡單了。沒有什麽技術含量。為什麽?因為數據處理部分已經由數據庫完成。尤其是MySQL的使用。MySQL是免費的,所以大部分程序員都可以自由使用,而且MySQL也足夠快,所以做壹個PHP應用非常簡單。這就相當於給妳壹把槍妳也覺得沒必要學武術。當然,我不是說槍不如武。取而代之的是,有了槍的出現,孩子們可以輕松便捷地殺人。

再來說說為什麽是數據庫。我在這裏舉個例子。我去過北京壹個很有名的網站。當時我們有壹個資深PHP程序員在那裏講系統架構。我記得當程序員問妳壹個關於數據結構中算法的問題時,在場的觀眾(包括我)沒有壹個人能回答出來。然後程序員開始告訴妳壹些非常基礎的數據結構。這讓我想起了大學時上的數據結構課。這些基本的數據排序、搜索和傳輸問題在其他高級語言(如C)中非常普遍。但在PHP中沒有。PHPchina.com的論壇也有壹個板塊叫PHP的數據結構和算法。這個板塊的帖子也很少。

說到這裏,妳明白了嗎?大部分PHPer只處理表示層,但是借助MySQL的便捷使用,PHPer可以在不接觸任何數據結構和算法的情況下完成大部分開發任務,所以只有其中壹個具備以上,沒有PHP程序員可以回答那個數據結構的問題。如果是C等語言,情況可能會大不壹樣。是PHP的根讓PHP看起來很草根。

仔細回想壹下,目前網上討論最多的有兩個問題。壹是PHP類的使用(處理過程的封裝),二是開發框架。但是仔細分析的話,我們發現PHP中這些所謂復雜的概念並沒有數據處理。為什麽?有壹個數據庫。可以用Adodb或PHP5的PDO來完成。真的做好了嗎?沒有,這些只是連接數據庫,沒有數據處理。所以PHPer在臺面上似乎沒什麽可拿出來說的。

先說壹個具體的編碼問題,無級分類。這個概念我想大家都很熟悉。我見過兩種處理方式。首先是正宗的PHPer加工法,也是目前比較流行的。就是用數據庫來處理。而且字段很少,就加壹個父類的字段,判斷壹下。而且這個方法很實用。效率也高。但這不是數據處理的範疇,而是數據庫的搜索。

第二個是C程序員用PHP寫的。他把所有的分類信息從數據庫裏拿出來,用數據結構算法整理分發,然後輸出。

這裏我們不比較這兩種方法的效率,我想每個人都有自己的想法。但我想說明壹個問題,就是兩種做法的本質區別。PHPer用於數據庫處理,處理方法非常巧妙,效率很高。這種方式就是數據庫查詢。第二種方法更有特點。他認為數據庫是存儲數據的地方,具體的邏輯處理取決於自身的邏輯。

所以結論是第二種方法的用戶感覺更強,因為數據的邏輯是他組織的。而且我覺得PHPer的做法無非就是查詢數據庫。所以他認為PHPer是草根,只知道操作數據庫和排列頁面(smarty就是這麽做的)。

讓數據庫返回到其原始作業

說到這裏,我想大家都回憶了很多自己用PHP開發的經歷。妳發現大家真的在操作數據庫嗎?

那我們來討論壹下這個問題。數據庫不好嗎?為什麽我總是用數據庫處理數據?我想說的是,數據庫有問題,有很大的問題。當然,我不是說數據庫不能用,也不是貶低數據庫的性能。相反,我們沒有充分認識到數據庫的作用。

我的想法源於這樣壹件事,有壹次壹個網站的技術總監問我他們網站為什麽這麽慢,怎麽辦。當時我MSN裏Zend總部的工程師正好在線,我就問他PHP響應慢怎麽辦?他直接跟我說是數據庫問題。肯定是數據庫沒有優化。所以,我沒有給技術總監壹個明確的答復,因為我們不能涉及他們的數據庫設計。所以我給了壹些數據庫優化的建議。這種事情發生了很多次,我開始奇怪為什麽Zend總部的工程師總是告訴我是數據庫的問題。難道不能從PHP層面解決這個問題嗎?答案是否定的,因為PHP目前的運行速度已經很快了,通過Zend的性能分析也可以看到壹個用戶的點擊。PHP的運行時間只有不到10%。PHP在做什麽?它在等待。等待數據庫的查詢結果。這方面在現在的PHP產品中已經有了很大的改進,就是緩存和靜態網頁。

緩存可能對每個人來說都很陌生,但是對於PHP產品的用戶來說,靜態頁面現在已經非常清楚了。速度快,容易被搜索等等,好處不言而喻。開玩笑的說,現在網站首頁只需要硬盤足夠大就可以實現靜態頁面。j至於緩存,比較復雜,也是大部分PHPer比較頭疼的問題。甚至有人會用c來實現。因為緩存中數據的有效期很難驗證、查找、提取、更新等等。當然,有些人會使用數據庫來處理緩存問題。

所以當訪問量劇增時,很多基於PHP的網站會出現的問題都是數據庫造成的。數據庫同步的問題不算什麽。關鍵是數據庫的響應速度會呈指數級下降。我在10年10月23日LAMP發布會上問過MySQL的副總裁這個問題。他當時並沒有給我壹個完美的答案(這也是我意料之中的),因為數據庫總會有瓶頸,除非是神仙數據庫,哈哈!

這裏說個題外話。我在LAMP大會上和雅虎的壹個技術高管聊天的時候,我問他雅虎在選擇MySQL還是Oracle的時候是怎麽想的。他的回答讓我非常吃驚。他說我們大部分時間會使用MySQL,因為它的性能已經滿足了我們的要求。但是什麽時候我們會選擇Oracle,也就是什麽時候我們需要存儲收費用戶的數據。我問為什麽,Oracle比MySQL更穩定嗎?他說對此沒有特別的考慮。關鍵是如果我們用Oracle,出現問題可以找負責人,Oracle會負責處理事故,但是如果我們用MySQL,可以去找誰?

所以我們對數據庫的看法要糾正,就是說數據庫不是萬能的。有實力就開發自己的數據庫。聽說谷歌就是那樣的。

那麽我們對數據庫有什麽看法呢?我個人的理解是,數據庫只是降低開發成本的壹種手段。因為采用數據庫後,我們不需要考慮數據的存儲,尤其是排序和搜索。但是這會帶來什麽問題呢?當業務擴展時,數據庫成為瓶頸。這時候問題就很難了。因為這是底層的數據處理。牽壹發而動全身。

所以我認為正確的觀點是數據庫是數據備份機。怎麽理解呢?我們只需要保證數據存儲的有效性。這是數據庫的核心功能,但是因為數據庫的方便排序等功能,大家把太多的處理交給數據庫去操作。當用戶點擊PHP時,大量的任務交給數據庫,然後為用戶安排結果。這對數據庫不公平。這就是為什麽人們開始抱怨數據庫的性能。

鑒於這個觀點,我們再舉壹個例子。有壹次去壹家大型互聯網公司參觀(基本上國內去過互聯網的人都知道)。他們很少使用PHP,但我了解到他們的其他業務是如何使用數據庫的。他們自豪地告訴我,他們在數據庫外圍有第二個數據庫(我在這裏命名為第二個數據庫)。為什麽叫第二數據庫?這是壹個緩存系統。那麽開發工程師如何從這個緩存系統中獲取數據呢?技術總監自豪地說,他們的緩存系統有SQL查詢語句。我當時很驚訝,但後來我覺得我真的需要這個。因為當妳的緩存系統達到壹定的級別時,從緩存中獲取數據是非常復雜的,所以只需為緩存系統編寫壹條SQL查詢語句來分析、處理和返回數據。而且他們告訴我,在他們那裏,就算用PHP,也是讓PHP去那個緩存系統讀取數據。

所以,如果妳能處理好這個問題,把數據存儲在數據庫裏,然後數據庫只起到備份的作用。然後您使用自己的中間層來處理分析數據,結果是90%以上的用戶不訪問數據庫。有人會說,這不就是個連接池的東西嗎?是的,因為數據庫的瓶頸無法解決,我們只能在Web服務器和數據庫之間加壹個中間層作為緩沖。

可能大家會說,好吧,這個我們已經知道了。我想說的是它引發的兩個想法:

首先,壹些語言已經有了連接池技術,那些程序員可以很容易地使用連接池來構建大規模的應用程序。所以如果他們認為PHPer只會使用數據庫,我們能說他們只會使用連接池嗎?連接池和數據庫在這個概念上有什麽區別?

第二,當PHPer開始構建自己的緩存系統時,是否突破了PHPer只使用數據庫的層面?因為他參與了數據邏輯的處理。那麽他還是草根嗎?

最後,懂得獨立思考的PHPer不是草根,壹切都交給數據庫去做。