這是典型好萊塢情節(jié):分道揚鑣的兩位老朋友間的戰(zhàn)斗。摩擦經(jīng)常開始于一位對另一位不言而喻的領(lǐng)域感興趣。這部電影的編程語言版本是Node.js的引入將好友情節(jié)變成一場旗鼓相當(dāng)?shù)谋荣?。PHP和JavaScript,兩個曾經(jīng)一起統(tǒng)治互聯(lián)網(wǎng)的合作伙伴現(xiàn)在為了開發(fā)者心中的份額開始一決雌雄。
在過去,他們的合作關(guān)系很簡單。JavaScript處理瀏覽器上的小細(xì)節(jié),PHP處理所有的存在于80端口和MySQL的服務(wù)器端任務(wù)。這個幸福的聯(lián)合不斷支持著因特網(wǎng)的許多關(guān)鍵部分。在WordPress、Drupal和Facebook上,人們幾乎不會離開PHP一分鐘。
但是,后來一些聰明的孩子發(fā)現(xiàn)他能使JavaScript運行在服務(wù)器上。突然,我們發(fā)現(xiàn)沒必要使用PHP構(gòu)建下一代服務(wù)器棧了。一種語言就足夠建立Node.js和運行在客戶端的框架。對一些人來說,“JavaScript無處不在”變成了咒語。
當(dāng)然,結(jié)局并沒有寫完。相比較與吹噓Node.js的純粹和JavaScript無處不在的簡單的程序員,還有另外的程序員,他們對深度代碼庫和了解PHP的穩(wěn)定性感到滿意。怪老頭能夠擊退服務(wù)器端新貴嗎?JavaScript能推翻它的老朋友,實現(xiàn)統(tǒng)治世界嗎?我們在微波爐里再抓一把爆米花,坐下來瞧瞧。
PHP贏在何處:混合內(nèi)容的代碼
你正在打字,想法隨之變成你網(wǎng)站中的文本。你想為進程添加一個分支,根據(jù)URL的一些參數(shù),一點if-then語句就會使它看起來漂亮?;蛘呖赡苣阆霃臄?shù)據(jù)庫中加入文本或數(shù)據(jù)。用PHP,你能打開PHP魔法標(biāo)簽在幾秒內(nèi)開始編寫代碼。不需要模板——一切都是一個模板。不需要額外的文件或者煞費苦心的體系結(jié)構(gòu),因為可編程邏輯能量就在你的指尖。
Node贏在何處:分離的內(nèi)容
混合內(nèi)容的代碼是拐杖,最終會使你受到損害。當(dāng)然,在最初的兩到三次,混合HTML代碼是有趣的。但是不久,你的代碼庫亂成一團。真正的程序員添加結(jié)構(gòu),從邏輯層分離出裝飾層。對新的程序員來說,代碼很容易理解清楚,便于維護。運行在Node.js的框架由這樣的程序員所建,他們知道當(dāng)模型,視圖和控制器分離時,生活會變得更好。
PHP贏在何處:深的代碼庫
網(wǎng)絡(luò)充滿了PHP代碼。最受歡迎的構(gòu)建網(wǎng)站平臺(WordPress、Drupal和Joomla)都是用PHP編寫。不僅這些開源平臺,大部分他們插件也是用PHP編寫。網(wǎng)上到處有PHP代碼,它等著你去下載、修改和為你所用。
Node贏在何處:新的代碼意味著更多現(xiàn)代特征
當(dāng)然,網(wǎng)上有數(shù)以千計的開源PHP文件,但是一些是8歲的WordPress插件希望、祈禱有人下載它們。有誰愿意去花費幾個小時、幾天或者是幾周的時間去倒騰那些已經(jīng)好幾年沒有更新的代碼?Node.js插件不僅是新的,而且用最新體系的完整知識構(gòu)建而成。
PHP贏在何處:簡單(在一定程度上)
PHP中沒有太多的東西:幾個處理字符串、數(shù)字的變量和基本函數(shù)。它除了把數(shù)據(jù)從80端口移動到數(shù)據(jù)庫并返回,不會做的太多。這是應(yīng)該做的。現(xiàn)代數(shù)據(jù)庫是個神奇的工具,它能離開重的負(fù)載。對不應(yīng)該復(fù)雜工作,PHP的復(fù)雜度是適量的。
Node贏在何處:閉包和更多的復(fù)雜性
JavaScript可能會有許多把一些人逼瘋的小特質(zhì)。但在大多數(shù)情況下,它是一個娛樂現(xiàn)代語法的現(xiàn)代語言,有幾個有用的特征,比如閉包。你能容易地重新配置和拓展它,使強大的函數(shù)庫像jQuery成為可能。你能像傳遞對象一樣四處傳遞函數(shù)。為什么限制你自己呢?
PHP贏在何處:不需要客戶端應(yīng)用程序
所有的關(guān)于在瀏覽器和服務(wù)器上使用相同的語言的討論是好的,但是如果你不需要在瀏覽器上使用任何語言呢?如果你運送HTML表單中數(shù)據(jù)呢?瀏覽器彈出,不會出現(xiàn)被未啟動的JavaScript造成的令人頭疼的事情和小故障,這個JavaScript試圖在瀏覽器上創(chuàng)建一個來自二十多個web服務(wù)調(diào)用的頁面。純粹的HTML比其他東西工作更頻繁,而PHP是最優(yōu)化去創(chuàng)建HTML。為何費心在瀏覽器上用JavaScript呢?在服務(wù)器上建立所有操作,避免小手機上的小瀏覽器重載。
Node贏在何處:與HTML-fat PHP調(diào)用相對的瘦服務(wù)調(diào)用
雖然AJAX-crazy HTML5 Web應(yīng)用程序有許多移動部件,他們很酷,非常有效。一旦JavaScript代碼在瀏覽器緩存中,新數(shù)據(jù)沿著線路移動。這沒有大量的HTML標(biāo)記語言,不重復(fù)地去下載整個頁面。只有數(shù)據(jù)改變了。如果你愿意投入時間創(chuàng)建一個平滑的瀏覽器端Web應(yīng)用程序,這將會有不錯的報酬。Node.js是最優(yōu)化地去傳送數(shù)據(jù),僅僅只有數(shù)據(jù)通過Web服務(wù)。如果你的應(yīng)用程序是復(fù)雜而又?jǐn)?shù)據(jù)豐富的,這將是有效傳送的良好基礎(chǔ)。
PHP贏在何處:SQL
PHP與MySQL和它的許多變體,比如MariaDB。如果MySQL不全是正確的,還有其他的來自O(shè)racle和Microsoft的偉大的SQL數(shù)據(jù)庫。你的代碼用很少的改變就能轉(zhuǎn)換成你的查詢。廣闊的SQL世界沒邊界。一些最穩(wěn)定,成熟的代碼與SQL數(shù)據(jù)庫連接,意味著所有力量也能容易地被整合到PHP項目中。它可能不是完美幸福的家庭,但它是大的。
Node.js贏在何處:JSON
如果你必須接入SQL,Node.js的函數(shù)庫可以做到。但Node.js也有JSON,一個與許多最新NoSQL數(shù)據(jù)庫交互的通用語言。這并不是說你不能為你的PHP棧獲得JSON庫,但當(dāng)使用JavaScript時有些流體可使用JSON的簡單性去處理。這是從瀏覽器到Web服務(wù)器,再到數(shù)據(jù)庫的語法。冒號和花括號在每處的作用相同,這節(jié)約了你的時間。
PHP贏在何處:編碼速度
對大多數(shù)開發(fā)者,編寫PHP Web應(yīng)用程序感到更快:沒有編譯器,沒有部署,沒有JAR文件或者預(yù)處理器——僅僅是你喜歡的編輯器和一些PHP文件目錄。你的進度會不同,但就一起迅速確定項目而論,PHP是一個很好用的工具。
Node.js贏在何處:原始速度
編寫JavaScript代碼的過程中,當(dāng)你在計算花括號和圓括號時,它有點難,但是編寫成功后,你的Node.js代碼可以飛。它的回調(diào)機制很巧妙,因為能幫你節(jié)約運行線程的時間。核心被建好,旨在為你做一切,這不是每個人想要的嗎?