2015年1月22日 星期四

一場PHP與Node.js的聖戰



開發者該如何抉擇?
一場PHP與Node.js的聖戰

  這篇於1/12發表於www.infoworld.com 的專欄文章,作者是Peter Wayner,剛好我對PHP和JavaScript還挺有興趣的,因此看到這篇便分享給大家,文中作者用問與答的方式來回答PHP和Node.js在應用上的特點,不過最後他很聰明的不做出任何抉擇,由讀者自行來評判。
light saber duel fight
  尤如好萊塢常見的劇情:發生在兩個異途同歸老朋友之間的戰爭….他們的爭拗經常起因於無意間跨觸了另一位的敏感地帶,而現在程式語言的範疇也出現了類似這樣的劇情,往進者Node.js的出現,把PHP與Javascript這兩個曾經一起合作無間、獨霸網路世界的老友推到了相同的戰場,互相爭奪開發者的青睞。
    在以往,它們兩者之間的界限非常清楚,JavaScript居使用者端,安份的待在PC的瀏覽器上(我們稱為前端)展示著來自伺服器的資訊並接收使用者的輸入,而PHP盡責的在伺服器上處理來自HTTP(S)的資料並存取背後的資料庫(這部份我們稱為後端),長久以來這樣的分工模式一直完美的運作著,也成就了網際網路上WordPressDrupalFacebook這些為人稱頌的傳奇,若沒有Javascript+PHP,網路將不會是你我現在所看到的樣子。
    然而有一天,某些天才們突然發現了Javascript竟也可以運作在伺服器上,也就是網站或Web服務在後端用Javascript竟也能運作得很好,於是他們把這個執行在後端的Javascript稱作Node.js並且這個系統逐漸開始在業界流行起來,於是PHP頓時失去了網路霸主的光環,Javascript這個PHP曾經最要好的搭擋撈過界從前端跨足後端,把老友從寶座推落並且用自己的屁股坐上去,於是,「JavaScript everywhere」開始成了一些程式開發者最流行的口頭襌。
    當然,目前的劇情發展還尚未到結局部份,有些人稱頌Node.js的簡潔以及前後端統一的便利性,也有一些人極力維護有著豐富資源以及穩定廣泛使用的PHP,然而到底最終PHP會擊退莽撞的侵入者,還是JavaScript不顧老友情面一統前後端的世界呢?我們再繼續深究下去。

PHP贏面:混合的程式碼與頁面內容

  對於初學者來說,PHP是較具親和力的,無論何時,當你想在網站上放入內容或程式、添加子功能或函式、或者想要插入if-then語法讓網頁更加動人、甚至於在網址增加附帶參數、亦或增加一些字串到資料庫所傳回的內容,只要拿出神奇的PHP 標籤(<? 或<?php),不到數秒時間您就能在一張頁面上開始撰寫程式並完成需要的功能,用不到任何的樣本(Template),因為在PHP的世界裏每個檔案都可看成樣本,而且額外的檔案或架構宣告也等都不需要,只要你能用手指頭敲出PHP程式碼就行了。

Node.js贏面:著重程式碼與內容分離

    不過程式碼混雜HTML頁面的寫法最終可能會讓你陷入一團亂的地步,一開始這樣的直覺的混合寫法可能對於初學者有趣而且簡單,但很快你就會發現,這些大雜燴般的程式碼成了一團混亂難懂的邏輯,比較有經驗的程式設計師會採用更有架構性的方式把展示層與邏輯層分離,這樣展示與邏輯分離的概念,對於初接觸程式的新人來說其實會很容易理解,最重要的,維護前人留下的程式碼也容易得多了。因此你可以猜得到,最早的Node.js,就是由那些清楚MVC架構(ModelView, and Controller)的天才們所發明的。

PHP贏面:深厚的歷史資源

目前的網路世界充滿了PHP的痕跡,最受歡迎的建站軟體如WordPressDrupalJoomla都是用PHP寫的,而且不僅這些為數眾多的開源碼軟體,它們所有的附加功能和插件(Plug-in)也都是PHP,可以這樣說,PHP的程式碼到處都是,你隨時都找得到並下載所需要的功能和套件,而且也可以去修改它以符合你要的樣子。

Node.js贏面:新架構與新功能的支援

雖然目前有數不清開源的PHP程式碼可用,但是很多都是像WordPress這樣已經很多年歷史的老程式,且有很多plug-in也都已停止更新了,因此很多新進的年輕程式設計師並不屑學習這類要花時間在Copy/Paste程式碼方式架構網站的方法;而Node.js不僅夠新,而且是由那些懂得最新網站架構和功能的怪才們所開發,因此它與日新月異的使用者前端更相搭配。

PHP贏面:簡單

除了最後端的資料庫處理那段,要使用PHP並不難,只要瞭解一些變數用法和基本的函數就可以開始用PHP來操作字串和數字了,而這也是PHP的初衷:容易學習。此外,PHP需要搭配一個設計良好的資料庫,它分擔了部份loading讓PHP更顯得簡單,因此,PHP適用在那些不是非常複雜或高難度工作上。

Node.js贏面:複雜的「閉包」(closures)以及其它

JavaScript擁有很多特質讓它可以成就一些神奇、瘋狂的點子,事際上它是一個具有新式語法及架構(像是稱為closures這種奇特而難以理解的概念)的新程式語言,我們可以重新針對該語言作設定並延伸,製作出類似Jquery這樣powerful的程序庫,我們也可以把函數像是物件般的傳遞,在Node.js中,想像力是沒有限制的。

PHP贏面:不需要與前端互動

很多人認為前端瀏覽器和後端伺服器能使用相同的語言是相當不錯的事,但如果前端瀏覽器並不需要撰寫程式碼而僅僅是單純的HTML呢?因為純HTML不帶有任何程式碼的網頁在使用上更為廣泛,而且PHP在與純HTML頁面的搭配上更有優勢,所有的工作和資訊在Server端都處理完了才送出,我們也不用煩惱Javascript端的小問題和瀏覽器的loading。

Node.js贏面:精簡的伺服端呼叫

由於PHP要送出HTML碼並夾帶各式資訊,因此每次的呼叫都相當的肥大,而Node.js則精簡且效率,如果JavaScript程式碼已經存在於瀏覽器的快取當中,那麼兩者之間傳送的更只有update資料部份,Node.js不會傳送大量的HTML標簽,也不會重複的遞送整頁的資訊,除非資料有所改變,因此,Node.js相當適合應用在建置各式的Web 服務(Web services),如果你的程式相當複雜而且有著大量的資訊,那麼用Node.js來替你的網站建置Web services相當適合。

PHP贏面:SQL

如果說PHP和Javascript是好朋友,那麼mySQL可說是它的孿生兄弟了,PHP有很多的特性就是為了mySQL和與它類似的SQL資料庫而生,例如MariaDB、Oracle、MSSQL等,在PHP要轉換資料庫很容易,只要在連結資料庫的程式碼修改一下就行了。

Node.js贏面:JSON

如果你一定要使用SQL,Node.js也有函式庫可以支援,但是Node.js與JSON這類的NoSQL資料庫搭配會更適合,雖然目前PHP也有支援JSON,但是JavaScript與JSON搭配使用更具效率與簡捷,冒號及大括號所構成的JSON格式從前端瀏覽器到後端伺服器以及更後端的資料庫都能處理並解譯, 它不像複雜龐大的SQL讓人感到挫折與頭疼。

PHP贏面:程式撰寫的速度

對大部份的開發者來說,感覺用PHP撰寫程式比較快速,因為不需要complier,不需要佈署,不需要jar檔或預處理,只需要一個常用的文字編輯器然後把寫好的PHP檔放在同個目錄下就可以了,當你有急迫的專案需要完成,PHP可以快速的幫你達成。

Node.js贏面:執行速度

寫JavaScript比PHP有更多的大小括號要注意,但如果處理得完美,它可以讓你的Node.js執行得更快速,而且特有的callback機制(當一個函式執行完畢後所執行的那個函式就是所謂的callback)更讓你不會在一團混亂的threads當中迷失。

沒有留言:

張貼留言