這是典型好萊塢情節(jié):分道揚(yáng)鑣的兩位老朋友間的戰(zhàn)斗。摩擦經(jīng)常開始于一位對(duì)另一位不言而喻的領(lǐng)域感興趣。這部電影的編程語(yǔ)言版本是Node.js的引入將好友情節(jié)變成一場(chǎng)旗鼓相當(dāng)?shù)谋荣悺HP和JavaScript,兩個(gè)曾經(jīng)一起統(tǒng)治互聯(lián)網(wǎng)的合作伙伴現(xiàn)在為了開發(fā)者心中的份額開始一決雌雄。
在過去艾杏,他們的合作關(guān)系很簡(jiǎn)單。JavaScript處理瀏覽器上的小細(xì)節(jié)盅藻,PHP處理所有的存在于80端口和MySQL的服務(wù)器端任務(wù)购桑。這個(gè)幸福的聯(lián)合不斷支持著因特網(wǎng)的許多關(guān)鍵部分。在WordPress萧求、Drupal和Facebook上其兴,人們幾乎不會(huì)離開PHP一分鐘。
但是夸政,后來(lái)一些聰明的孩子發(fā)現(xiàn)他能使JavaScript運(yùn)行在服務(wù)器上元旬。突然,我們發(fā)現(xiàn)沒必要使用PHP構(gòu)建下一代服務(wù)器棧了守问。一種語(yǔ)言就足夠建立Node.js和運(yùn)行在客戶端的框架匀归。對(duì)一些人來(lái)說(shuō),“JavaScript無(wú)處不在”變成了咒語(yǔ)耗帕。
當(dāng)然穆端,結(jié)局并沒有寫完。相比較與吹噓Node.js的純粹和JavaScript無(wú)處不在的簡(jiǎn)單的程序員仿便,還有另外的程序員体啰,他們對(duì)深度代碼庫(kù)和了解PHP的穩(wěn)定性感到滿意。怪老頭能夠擊退服務(wù)器端新貴嗎嗽仪?JavaScript能推翻它的老朋友荒勇,實(shí)現(xiàn)統(tǒng)治世界嗎?我們?cè)谖⒉t里再抓一把爆米花闻坚,坐下來(lái)瞧瞧沽翔。
PHP贏在何處:混合內(nèi)容的代碼
你正在打字,想法隨之變成你網(wǎng)站中的文本。你想為進(jìn)程添加一個(gè)分支仅偎,根據(jù)URL的一些參數(shù)跨蟹,一點(diǎn)if-then語(yǔ)句就會(huì)使它看起來(lái)漂亮¢倭ぃ或者可能你想從數(shù)據(jù)庫(kù)中加入文本或數(shù)據(jù)窗轩。用PHP,你能打開PHP魔法標(biāo)簽在幾秒內(nèi)開始編寫代碼威恼。不需要模板——一切都是一個(gè)模板品姓。不需要額外的文件或者煞費(fèi)苦心的體系結(jié)構(gòu),因?yàn)榭删幊踢壿嬆芰烤驮谀愕闹讣狻?/p>
Node贏在何處:分離的內(nèi)容
混合內(nèi)容的代碼是拐杖箫措,最終會(huì)使你受到損害。當(dāng)然衬潦,在最初的兩到三次斤蔓,混合HTML代碼是有趣的。但是不久镀岛,你的代碼庫(kù)亂成一團(tuán)弦牡。真正的程序員添加結(jié)構(gòu),從邏輯層分離出裝飾層漂羊。對(duì)新的程序員來(lái)說(shuō)驾锰,代碼很容易理解清楚,便于維護(hù)走越。運(yùn)行在Node.js的框架由這樣的程序員所建椭豫,他們知道當(dāng)模型,視圖和控制器分離時(shí)旨指,生活會(huì)變得更好赏酥。
PHP贏在何處:深的代碼庫(kù)
網(wǎng)絡(luò)充滿了PHP代碼。最受歡迎的構(gòu)建網(wǎng)站平臺(tái)(WordPress谆构、Drupal和Joomla)都是用PHP編寫裸扶。不僅這些開源平臺(tái),大部分他們插件也是用PHP編寫搬素。網(wǎng)上到處有PHP代碼呵晨,它等著你去下載、修改和為你所用熬尺。
Node贏在何處:新的代碼意味著更多現(xiàn)代特征
當(dāng)然摸屠,網(wǎng)上有數(shù)以千計(jì)的開源PHP文件,但是一些是8歲的WordPress插件希望猪杭、祈禱有人下載它們餐塘。有誰(shuí)愿意去花費(fèi)幾個(gè)小時(shí)、幾天或者是幾周的時(shí)間去倒騰那些已經(jīng)好幾年沒有更新的代碼皂吮?Node.js插件不僅是新的戒傻,而且用最新體系的完整知識(shí)構(gòu)建而成税手。
PHP贏在何處:簡(jiǎn)單(在一定程度上)
PHP中沒有太多的東西:幾個(gè)處理字符串、數(shù)字的變量和基本函數(shù)需纳。它除了把數(shù)據(jù)從80端口移動(dòng)到數(shù)據(jù)庫(kù)并返回芦倒,不會(huì)做的太多。這是應(yīng)該做的〔霍妫現(xiàn)代數(shù)據(jù)庫(kù)是個(gè)神奇的工具兵扬,它能離開重的負(fù)載。對(duì)不應(yīng)該復(fù)雜工作口蝠,PHP的復(fù)雜度是適量的器钟。
Node贏在何處:閉包和更多的復(fù)雜性
JavaScript可能會(huì)有許多把一些人逼瘋的小特質(zhì)。但在大多數(shù)情況下妙蔗,它是一個(gè)娛樂現(xiàn)代語(yǔ)法的現(xiàn)代語(yǔ)言傲霸,有幾個(gè)有用的特征,比如閉包眉反。你能容易地重新配置和拓展它昙啄,使強(qiáng)大的函數(shù)庫(kù)像jQuery成為可能。你能像傳遞對(duì)象一樣四處傳遞函數(shù)寸五。為什么限制你自己呢梳凛?
PHP贏在何處:不需要客戶端應(yīng)用程序
所有的關(guān)于在瀏覽器和服務(wù)器上使用相同的語(yǔ)言的討論是好的,但是如果你不需要在瀏覽器上使用任何語(yǔ)言呢梳杏?如果你運(yùn)送HTML表單中數(shù)據(jù)呢韧拒?瀏覽器彈出,不會(huì)出現(xiàn)被未啟動(dòng)的JavaScript造成的令人頭疼的事情和小故障秘狞,這個(gè)JavaScript試圖在瀏覽器上創(chuàng)建一個(gè)來(lái)自二十多個(gè)web服務(wù)調(diào)用的頁(yè)面叭莫。純粹的HTML比其他東西工作更頻繁,而PHP是最優(yōu)化去創(chuàng)建HTML烁试。為何費(fèi)心在瀏覽器上用JavaScript呢雇初?在服務(wù)器上建立所有操作,避免小手機(jī)上的小瀏覽器重載减响。
Node贏在何處:與HTML-fat PHP調(diào)用相對(duì)的瘦服務(wù)調(diào)用
雖然AJAX-crazy HTML5 Web應(yīng)用程序有許多移動(dòng)部件靖诗,他們很酷,非常有效支示。一旦JavaScript代碼在瀏覽器緩存中刊橘,新數(shù)據(jù)沿著線路移動(dòng)。這沒有大量的HTML標(biāo)記語(yǔ)言颂鸿,不重復(fù)地去下載整個(gè)頁(yè)面促绵。只有數(shù)據(jù)改變了。如果你愿意投入時(shí)間創(chuàng)建一個(gè)平滑的瀏覽器端Web應(yīng)用程序,這將會(huì)有不錯(cuò)的報(bào)酬败晴。Node.js是最優(yōu)化地去傳送數(shù)據(jù)浓冒,僅僅只有數(shù)據(jù)通過Web服務(wù)。如果你的應(yīng)用程序是復(fù)雜而又?jǐn)?shù)據(jù)豐富的尖坤,這將是有效傳送的良好基礎(chǔ)稳懒。
PHP贏在何處:SQL
PHP與MySQL和它的許多變體,比如MariaDB慢味。如果MySQL不全是正確的场梆,還有其他的來(lái)自O(shè)racle和Microsoft的偉大的SQL數(shù)據(jù)庫(kù)。你的代碼用很少的改變就能轉(zhuǎn)換成你的查詢纯路。廣闊的SQL世界沒邊界或油。一些最穩(wěn)定,成熟的代碼與SQL數(shù)據(jù)庫(kù)連接感昼,意味著所有力量也能容易地被整合到PHP項(xiàng)目中装哆。它可能不是完美幸福的家庭,但它是大的定嗓。
Node.js贏在何處:JSON
如果你必須接入SQL,Node.js的函數(shù)庫(kù)可以做到萍桌。但Node.js也有JSON宵溅,一個(gè)與許多最新NoSQL數(shù)據(jù)庫(kù)交互的通用語(yǔ)言。這并不是說(shuō)你不能為你的PHP棧獲得JSON庫(kù)上炎,但當(dāng)使用JavaScript時(shí)有些流體可使用JSON的簡(jiǎn)單性去處理恃逻。這是從瀏覽器到Web服務(wù)器,再到數(shù)據(jù)庫(kù)的語(yǔ)法藕施。冒號(hào)和花括號(hào)在每處的作用相同寇损,這節(jié)約了你的時(shí)間。
PHP贏在何處:編碼速度
對(duì)大多數(shù)開發(fā)者裳食,編寫PHP Web應(yīng)用程序感到更快:沒有編譯器矛市,沒有部署,沒有JAR文件或者預(yù)處理器——僅僅是你喜歡的編輯器和一些PHP文件目錄诲祸。你的進(jìn)度會(huì)不同浊吏,但就一起迅速確定項(xiàng)目而論,PHP是一個(gè)很好用的工具救氯。
Node.js贏在何處:原始速度
編寫JavaScript代碼的過程中找田,當(dāng)你在計(jì)算花括號(hào)和圓括號(hào)時(shí),它有點(diǎn)難着憨,但是編寫成功后墩衙,你的Node.js代碼可以飛。它的回調(diào)機(jī)制很巧妙,因?yàn)槟軒湍愎?jié)約運(yùn)行線程的時(shí)間漆改。核心被建好心铃,旨在為你做一切,這不是每個(gè)人想要的嗎籽懦?