如下文字並無很是多的技術詞彙,因此只要對PHP感興趣的人均可以看看。前端
從PHP誕生之日起,PHP就開始在Web應用方面爲廣大的程序員服務。同時,做爲針對Web開發量身定製的腳本語言,PHP一直秉承簡單、開源的思想,這也使得PHP得以快速的發展,而且大力地推進Web2.0的出現與發展。可是,長期以來,PHPer(PHP Programmers)被認爲是處於草根階層的程序員,被認爲是技術含量少,層次低的程序員。這點在國內尤爲突出。程序員
記得一個技術主管說過這樣一個事情。他給一個程序員分配了PHP的開發任務,沒想到那個程序員竟然說:「我是學Java出身的,你讓我去寫 PHP,你這不是在貶低我嗎?」。這件事情給我印象很深、觸動也很大。雖然這不能表明大部分程序員的見解,可是這麼認爲的人應該很多。還有人說,如今若是是大型的政府項目,PHP是確定不會被列入考慮的範圍以內的。web
那麼爲何PHPer會被認爲是草根階層,是由於它很簡單,人人均可以學會,因此沒什麼難度嗎?我之前也是這麼認爲。PHP入門很快,處理文件,數據,遠程鏈接,網絡編程都很是方便,官方也有這樣的說法:PHP學習的成本很低,因此你容易去使用它。這個想法也是廣泛的,甚至大部分的PHPer 本身都這樣認爲。算法
說到這裏,我想你們就會想到我爲何要寫這些文字。由於一年多的PHP推廣工做讓我瞭解到許許多多的使用PHP的公司的大概狀況。在這些過程當中我慢慢體會到其中的根本緣由。這裏我說是根本緣由雖然是我的的見解,可是我以爲事實就是如此。數據庫
那麼爲何PHPer會被當作草根階層,根本緣由是PHPer所做的事情(經過代碼實現)的絕大部分都是表現層的東西,這個熟悉PHP的人都知道。固然也會有PHP會說他用MVC結構編寫的某某框架具有的如何如何的功能。可是這些仍是表現層。因此只會處理表現層的程序員就被當作草根階層了。事實上也是如此,由於這種狀況下PHP確實很難構造大型的應用。編程
這就找到緣由了,不是的。爲何PHPer老是在負責表現層的東西呢。答案是底層的數據處理(Web應用就是數據存儲和查找)咱們通常不去觸及。好,那麼說到這裏有些人可能已經想到了,那不就是數據庫嗎?對,就是數據庫。讓PHPer一直當草根的元兇就是數據庫。爲何?瀏覽器
由於目前流行的web架構中,前端是負載均衡系統,中間是web服務器,後面是數據庫服務器。因此,大部分PHPer工做在Web服務器層面。由於數據庫已經很好地爲咱們組織數據了。因此PHP中沒有太多的算法,並且你們潛意識下也以爲不須要,更況且會影響性能。緩存
這種狀況下,PHPer就成爲了數據庫使用者,他老是在操做數據庫。而不是在作程序。一個最簡單的PHP腳本就是,鏈接數據庫,把數據取出來,而後用命令輸出到瀏覽器。整個過程不超過10行代碼。給人的感受就是太簡單了。沒有任何技術含量。爲何了,由於數據處理部分都已經被數據庫作完了。尤爲是MySQL的使用。MySQL是免費的,因此大多數程序員能夠自由地使用它,另外MySQL的速度夠快了,因此作個PHP應用程序很是的簡單。這就至關於給你槍之後你以爲沒有必要學習武功同樣。固然,我不是說槍沒有武功好。而是說,槍的出現,小孩均可以輕鬆便捷地殺人了。服務器
咱們再詳細說說爲何是數據庫。這裏我說一個例子。我去過北京一家很是著名的網站,當時咱們還有一個比較資深的PHP程序員在那說些系統架構的事情。我記得當時那個程序員問你們一個數據結構中的算法問題的時候,全場沒有一我的能答得出來(包括我)。而後那個程序員就開始給你們講些很基礎的數據結構的東西了。讓我一會兒回想到大學時候學的數據結構課。而這些基礎的數據排序、查找、傳遞的問題在其餘高級語言(好比C)是很是廣泛的。可是在PHP沒有。PHPchina.com的論壇也有個板塊叫PHP的數據結構和算法。這個板塊的帖子也是寥寥無幾。網絡
說到這裏,你們明白了吧?大部分PHPer僅僅處理表現層的東西,而在MySQL的便捷使用下,PHPer幾乎不用觸及任何數據結構與算法的狀況下完成大部分開發任務,因此一個纔有上面的,沒有一個PHP程序員可以回答出那道數據結構的問題,換成是C等語言,狀況可能就大不相同了。是PHPer草根,才讓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產品中有了很大的提升,那就是 Caching和網頁靜態化兩個方案。
Caching可能你們會比較陌生,可是網頁靜態化如今連PHP產品的用戶都很是清楚了。速度快、容易被搜索到等等,好處不言而喻。開玩笑地說,如今網站的主頁實現網頁靜態化只須要硬盤足夠大。J至於Caching就比較複雜些,也是大多數PHPer感到頭疼的地方。甚至於有些人會用C來實現。由於Caching中的數據有效期驗證、查找、提取、更新等等都是比較難處理。固然,也有人會用數據庫來處理 Caching問題。
因此,當訪問量激增的時候,PHP架構的網站會出現的不少問題都因數據庫而起。數據庫的同步問題還不算什麼。關鍵是數據庫的響應速度會有指數級的下降。這個問題我在10月23號LAMP發佈會的時候問過MySQL的副總裁。他當時也沒有給我比較完美的答案(這也個人意料之中),由於數據庫總會有瓶頸的,除非是神仙數據庫,哈哈!
這裏有個題外話,LAMP大會的時候我跟Yahoo的一個技術高管聊的時候,我問他Yahoo在選擇MySQL仍是Oracle的時候是怎麼考慮,他的答案令我很是驚訝。他說大部分的時候咱們是會用MySQL的,由於它的性能已經達到咱們的要求。可是何時咱們會選用Oracle呢,就是當咱們須要存儲收費用戶的數據的時候。我就問爲何,難道Oracle比MySQL穩定嗎?他說,這個倒沒有特別考慮。關鍵是若是使用Oracle的話,當出現問題的時候咱們能夠找到負責人,Oracle會負責事故的處理,可是若是用MySQL的話,咱們找誰去?
因此,咱們對數據庫的見解應該糾正過來,就是說數據庫不是萬能的。若是有實力的話本身開發數據庫。據說Google就是那樣的。
那麼咱們怎麼看待數據庫呢?我我的的理解是數據庫只是用來下降開發成本的手段。由於採用數據庫之後咱們不須要考慮數據的存儲,尤爲是排序和查找。可是這會帶來什麼問題呢?就是當業務膨脹的時候,數據庫就成爲瓶頸了。這個時候問題就會很是棘手。由於這個是底層的數據處理。牽一髮而動全身。
因此我認爲正確的觀點是,數據庫是一個數據備份機。怎麼理解,咱們只須要保證數據的存儲有效性就好了。而這原本就是數據庫的核心功能,只不過由於數據庫的方便的排序等功能讓你們把過多的處理都交給數據庫來操做了。一個用戶的點擊PHP就把一大堆的任務交給數據庫,而後把結果排列下給用戶就完事了。這對數據庫是不公平的。也是所以你們開始抱怨數據庫的性能了。
針對這個觀點,咱們再舉個例子,有一次我去拜訪一個大型的網絡公司(基本上國內只要上過互聯網的都知道),他們使用PHP不多,可是我瞭解到他們其它業務是怎麼使用數據庫。他們自豪地跟我介紹說他們在數據庫的外圍有個第二數據庫(我這裏起名叫第二數據庫)。爲何叫第二數據庫呢,原來它是一個緩存系統。那麼開發工程師怎麼去這個緩存系統獲取數據呢?那個技術總監自豪地說,他們這個緩存系統有SQL查詢語句。我當時很驚訝,可是後來想一想確實須要這個。由於當你的緩存系統達到必定量級的時候從緩存獲取數據都很是複雜,乾脆寫個SQL查詢語句讓緩存系統分析、處理並返回數據。並且他們告訴我,在他們那裏,就算是用PHP的話也是讓PHP去那個緩存系統讀取數據。
因此說,若是你能處理好這樣的問題的話,把數據存放在數據庫,而後數據庫只起到備份的做用。而後你用本身的中間層來處理分析數據,效果是90% 以上的用戶不訪問數據庫。有人就會說了,這不就相似鏈接池的東西嗎?是的,由於數據庫的瓶頸是沒法解決的,咱們只能在Web服務器和數據庫中間加個中間層來作緩衝。
可能你們會說了,切,這個咱們早就知道了。那好,這裏我要說的是它引起的兩點思考:
第一,有些語言已經有鏈接池技術的基礎上,那些程序員能夠方便地使用鏈接池而構建大型應用。那麼若是他們認爲 PHPer只會是用數據庫,那麼咱們是否是能夠說他們只會是用鏈接池呢?鏈接池和數據庫在這個概念上有何區別?
第二,當PHPer開始構建本身的緩存系統的時候,他是否是突破了PHPer只會是用數據庫的層次?由於他參與了數據邏輯的處理工做。那麼他仍是草根嗎?
最後,懂得獨立思考的PHPer不是草根,什麼事情都丟給數據庫去作的纔是。
轉載隨意,但請帶上本文地址: