PHP vs Node.js 深入討論

petterchx發表於2021-09-09

網路正在處於一個日新月異的發展時代。伺服器端開發人員在選擇語言的時候非常困惑,有長期占主導地位的語言,例如C、Java和Perl,也有專注於web開發的語言,例如Ruby、Clojure和Go。只要你的專案執行良好,你的選擇就顯得沒有那麼重要了。

PHP vs Node.js

但是如何讓這些新的web開發人員做出一個正確的選擇呢?

我不希望展開一場PHP、NodeJs兩大陣營之間的戰爭,我將會對比這兩種語言所在領域的發展狀況:

  • PHP
    Rasmus Lerdorf在1994年創造出了PHP。它是由安裝在web伺服器(Apache、Ngix)上的元件執行的。PHP程式碼可以和HTML混合到一塊。 對於初學者就能很快寫出很有價值的程式碼,這並不需要太多的練習。 這讓PHP變得越來越流行, 現在全球百分之八十的伺服器上都在執行著PHP。全球四分之一的網站都在用的一個內容管理系統–WordPress,就是用PHP寫的。
  • Node.js
    Ryan Dahl在2009年創造了Node.js。它是基於Google的V8 JavaScript解釋引擎(在Chrome瀏覽器裡它負責執行客戶端的JavaScript程式碼)。與其它語言不同的是Node.js內建了處理網路請求和響應的函式庫,所以你不需要單獨的伺服器(Apache、Ngix)或者其他依賴。Node.js雖然很新但是很快就獲得了極大的追捧。在很多的大公司都有在使用,例如:Microsoft,Yahoo,LinkedIn和PayPal。

我們所鍾愛的C#、Java、Ruby、Python、Perl、Erlang、C++、Go、Dart、Scala、Haskell等等,它們呢?

如果文章裡邊比較瞭如上所有語言的各種引數,文章將會非常長,你還會讀它麼?你期望一個程式設計師瞭解所有的程式開發語言嗎?這顯然是不可能的。我主要對PHP和Node.js做了比較,主要原因如下:

  1. 首先它們之間值得比較。兩者都是開放原始碼,都是致力於web開發,並且都可用於相似的專案。
  2. PHP已經發布了很久了,但是Node.js才剛剛興起,並受到越來越多的關注。難道PHP的程式設計師應該相信Node.js的宣傳?應該考慮轉換語言?
  3. 我瞭解,熱愛程式語言,自從20世紀90年代之後我就一直使用PHP和JavaScript,並且也有幾年的Node.js的經驗。除此之外我也涉獵了其他的技術,但是在這裡我還不能對他們作出客觀評價。

另外,對多少語言做比較不重要,因為總會有某些地方的某些人抱怨我沒有提到他們語言。

SitePoint上的角逐

程式設計師會花費很多時間來提升他們自己的程式設計能力。一些人有程式語言之間的延伸能力,但是這些達到更高層次的人根據很多的因素來做出他們自己的選擇。從主觀方面來說,你將會推進並且捍衛你的技術決策。

SitePoint Smackdowns並沒有採取“選擇適合你自己的,朋友”這樣的觀點。我將會根據個人的經驗、要求和喜好提出建議。你可能不會同意所有的我所說的所有觀點,這並不重要,重要的是你的意見將會給其他人做出更加明智的選擇。

評估方法

下面將會對 PHP 和 Node.js 進行十個輪次的比較。每個回合都會考量可以應用到任意 web 技術的常見的開發挑戰。我們不會太深入討論細節;很少有人會關心隨機數生成器或陣列排序的價值。

贏得最多回合的將會是優勝者。準備好了嗎?開始較量吧。。。。。。

第一輪:起步

建立一個“Hello World” web 頁面有多快呢?在 PHP 中:

<?php
    echo 'Hello World!';
?>

這段程式碼可以放置在可以被 PHP 引擎解析的任意檔案中–通常,是以 .php 為字尾的檔案。在瀏覽器中輸入 URL 跳轉到檔案即可。

不可否認,這不是全部。這段程式碼只能執行於安裝了 PHP 的 web 伺服器(PHP 有一個內建的伺服器,儘管如此,最好還是使用一個更健壯的伺服器)。大多數作業系統提供了伺服器軟體,如 windows 上的 IIS,Mac 和 Linux 上的 Apache,儘管它們需要啟動和配置。通常使用提前構建的安裝程式,如 XAMPP 或虛擬機器映象(如 Vagrant)。一種更簡單的方式:上傳你的檔案到任意的 web 主機。

對比而言,安裝 Node.js 輕而易舉。你可以 下載安裝程式 或者 使用包管理器。 接下來讓我們在 hello.js 中建立 web 頁面:

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World!');
}).listen(3000, '127.0.0.1');

在瀏覽器中訪問 http://127.0.0.1:3000/  之前,你需要在終端輸入 node hello.js 來啟動應用程式 。通過上面的五行程式碼,我們已經建立了一個小型的 web 伺服器,儘管這很令人吃驚,但是即便擁有很強客戶端 JavaScript 經驗的人也很難理解。

PHP 在概念上更簡單所以贏得本輪。稍微懂得一些 PHP 宣告的人就可以開發一些有用的東西。PHP 有更多的軟體依賴,但是 PHP 的概念對於新手來說不那麼繁瑣。

懂一些 JavaScript 和開發 Node.js 應用是兩回事兒,Node.js 開發方法和大多數服務端技術不同,你需要先弄明白一些相當複雜的概念,比如關閉和回撥函式。

第二輪:幫助和支援

沒有官方文件和資源(課程,論壇,堆疊溢位)的幫助你必將舉步維艱。 PHP 在本輪輕易勝出,她有大量的指南和二十年的 Q&A。無論你想做什麼,總會有人在你之前已經面對過同樣的問題。

Node.js 擁有很好的文件,但是更加年輕,能提供的幫助較 PHP 也少。JavaScript 在市面上的時間和 PHP 一樣久,但是主要的幫助都是針對瀏覽器開發的,那基本沒啥幫助。

第三回合: 語言語法

宣告與結構是不是符合邏輯而且簡單好用?

不像一些語言跟框架,PHP 不會限制你按特定的方式編寫,具體怎麼搞隨你。你可以從幾行的程式開始,然後新增些方法,進而寫一些簡單的 PHP4 模式的物件,最後編寫優雅的物件導向的 MVC 模式 PHP5+ 的應用。你的程式碼開始可能比較混亂,但也能工作,而且會隨著理解的深入越寫越好。

PHP 的語法在版本間可能略有調整,但是向後相容一般都做得很好。但不幸的是,這也導致了一個問題:PHP 很混亂。例如,怎麼統計一個字串中字元的個數?是 count?str_len? 還是 strlen?亦或 mb_strlen?PHP 有數以百記的函式,而且命名規則也也不完全一致。可以試試不查文件寫幾行程式碼。

JavaScript 相對就簡單些,只有幾十個核心宣告。不過語法就經常被開發者噴了,因為它的原型化物件模型看起來平易近人,實際上卻不是。而且各種數學錯誤(0.1+0.2 != 0.3)以及型別轉換的混亂(’4′ + 2 == ’42′ 和 ’4′ – 2 == 2)也招致不少抱怨,但這些情況世界很少導致什麼問題,多數語言都有這種藉口。

PHP 有他的優點,但是這回合我判 Node.js 勝。理由如下:

  1. JavaScript 是世界上最難理解的語言 — 但是,當哪天你頓悟以後,概念一通,就會發現其他語言都太過笨拙了。
  2. JavaScript 程式碼比 PHP 簡潔。例如,你再不需要跟 JSON 轉來轉去—— UTF-8 也不用
  3. 全棧工程師可以同時在客戶端與服務端使用 JavaScript 。大腦不需要來回切換。
  4. 深入理解 JavaScript 會讓你更想用它,但是 PHP 不是這樣。

第四輪:開發工具

兩種技術都有一些很好的編輯器,整合開發環境,偵錯程式,驗證器和其他工具。我認為這是平局,但是這裡有一些工具給 Node.js 些許優勢:NPM-包管理器。 NPM 允許你安裝和管理依賴,設定配置變數,定義指令碼和其他。

PHP 的 Composer 專案受 NPM 激發,在有些方面更強。但是,PHP 在預設情況想不提供,活動庫較小,在社群的影響更小。

Grunt 和 Gulp 之類革新了開發方法的構建工具的壯大,NPM 也有一部分功勞。有時候 PHP 開發者也許想要/需要安裝 node.js,這不是倒退。

第五輪:環境

技術可以在哪使用和部署?支援哪些平臺和生態系統?網頁開發者經常需要開發一些並不完全針對網頁的應用,比如構建工具,遷移工具,資料庫轉換指令碼等。

PHP 有辦法開發桌面應用和命令列工具,但是你不會使用他們。本質上,PHP 是一個服務端技術,他很擅長該領域,但是很少延伸到這之外。

若干年前,JavaScript 被認為限制很多,有一些邊緣技術,但是他的主戰場還是瀏覽器。Node.js 已經改變了這一感覺並井噴出了很多 JavaScript 專案,你可以在任何地方使用 JavaScript:瀏覽器,伺服器,終端,桌面甚至嵌入式系統,這使得 JavaScript 無處不在。

第六輪:整合

開發技術很受限制,除非他們能與資料庫和驅動整合。PHP 在這方面很強,PHP 面世已經很多年,他的擴充套件使他能和擁有主流或冷門的 API 的伺服器直接通訊。

Node.js 正在迎頭直追,但是你也許會為某些老舊,冷門的技術尋找成熟整合元件而頭疼。

第七輪:託管和部署

部署你絢麗新應用到線上網頁伺服器有多容易?這是 PHP 的另一次完勝。隨機聯絡某個網頁託管公司你可以找到對主要的 PHP 支援,也許還免費附送 MySQL。對於沙盒,PHP 被認為更簡單,有風險的擴充套件可以被禁用。

Node.js 是個不同的野獸,服務端的應用永遠執行。你需要一臺物理/虛擬/雲或定製的伺服器環境,最好有 root 許可權,這對有些伺服器來說遙不可及,特別是那些共享的伺服器,你有可能讓整臺伺服器當機。

Node.js 託管將會變得簡單,但是我認為他永遠沒法像 FTP 上傳一些 PHP 檔案那麼方便。

第八輪:效能

PHP 很勤快,有很多專案跟選項可以使它跑得更快。即使那些對效能要求很嚴苛的 PHP 開發者也幾乎不會擔心速度問題, 但是 Node.js 效能通常更好一些。 當然,效能很大程度上決定於開發團隊的經驗以及是否上心, 但是 Node.js 還是有如下幾條優勢的:

更少的依賴

所有對 PHP 應用的請求都必須經過一個 WEB 伺服器的路由,來啟動 PHP 的直譯器執行 PHP 程式碼。Node.js 不需要這些依賴, 而且你基本一定會使用一個帶伺服器的框架,像 Express,他很輕量,很好的扮演你應用的一部分。

更小更快的直譯器

Node.js 的直譯器比 PHP 的更小更靈活。 他並不受舊版語言遺留相容問題的拖累,而且 Google 在 V8 引擎效能改善上出了大力。

應用永久線上

PHP 遵循標準客戶端-服務端模型。 每個頁面請求都會初始化應用; 你讀取配置引數、連線資料庫、讀取資訊、渲染 HTML。Node.js 應用持久執行,只需要啟動一次。例如,你可以建立一個單獨資料連線物件,然後所求請求一起復用。公認的,PHP 也有一些途徑來實現,比如使用 Memcached ,但是這已經不是語言的標準特性了。

事件驅動,無阻塞 I/O

PHP 跟其他多數服務端語言採用阻塞執行的模型。 當你執行一個命令,比如從資料庫取資料,那麼必須等這個指令執行完成後,才會執行下面的內容。 Node.js 通常不會等的。 取而代之的是, 你需要提供一個回撥函式,這個函式當指令執行完後會被呼叫一次。例如:

// fetch records from a NoSQL database
DB.collection('test').find({}).toArray(process);
console.log('finished');

// process database information
function process(err, recs) {
    if (!err) {
        console.log(recs.length + ' records returned');
    }
}

這個例子中, 控制檯會先輸出‘finished’,然後輸出‘N records returned’,因為 process 函式是所有資料返回的時候才被呼叫的。 換句話說,當直譯器在其它程式處理的時候可以幹些別的事情。

注意情況比較複雜,還有幾個警告:

  • Node.js/JavaScript 只能在單執行緒上執行,但是大多數 web 伺服器都是多執行緒,而且併發的處理請求。
  • 一個使用者長時間執行的 JavaScript 處理會阻止其它使用者的程式碼執行,除非拆分任務或者使用Web Workers
  • 基準測試是主觀的和有缺陷的;可以找到一些例子 Node.js 比較好,而一些相對的例子 PHP 比較好 。程式設計師只是在嘗試證明他們的信仰!
  • 書寫非同步的事件驅動的程式碼非常複雜,非常有挑戰性。

我只能從我的經驗來講: 我的 Node.js 應用要明顯比 PHP 的同等應用要快。你的可能不是,但是不試是永遠不會知道的。

第九輪:開發者激情

這會超出”常見網頁開發挑戰“這樣的目標,但是這很重要。如果你恐懼每天寫程式碼,那你無所謂哪門語言更好。

很難為此做出比較但是一些 PHP 開發者對 PHP 這門語言很有激情。你最近一次讀到讓你走心的 PHP 文章或幻燈片是什麼時候?也許已無需再說?可能是更低的曝光度?或者我沒找對地方?PHP7 有一些新的功能,但是該技術已經原地踏步很多年了,雖說如此,很少有開發人員對PHP發牢騷。

JavaScript 分離了社群,有人愛也有人恨,一些程式設計師在中間猶豫不決,經管如此,對 Node.js 的反饋大多積極,她正處於風口浪尖,一部分原因是因為她很新,讚譽不一定持續。目前,Node.js 贏得本輪。

第十輪:前景

您選擇採用哪種服務端語言並不重要;即使她不再被更新也會照樣繼續工作(yay ColdFusion!)儘管使用量上趨於穩定但是很多人依然使用 PHP,我打包票她還能再堅挺二十年。

Node.js 崛起得很迅速,她提供了一種現代的開發方式,使用和客戶端開發一樣的語法同時支援 HTML5 變革式的特徵,比如網路套接字和服務端傳送事件。儘管大家對該語言的分叉函式有些爭議,但是Node.js的使用量還是呈指數級增長。

Node.js 勢必會蠶食 PHP 的市場份額,但是我不認為她能完全取而代之。兩種技術都有光輝的未來。我宣佈本輪平手。

最終贏家

最終分數:Node.js 贏得5輪,PHP 贏得4輪,一輪平手。原以為會倒向其中一方,結果比我預想的更中庸一些。

Node.js 有一定的學習曲線,對新手來說不夠理想但是她贏得了本次對決。而且,如果你是位喜歡該語言的靠譜的 JavaScript 程式設計師,Node.js 不會讓你失望。她更新潮而且提供自己網頁開發的體驗,你不會思念 PHP。

但是不要貶低 PHP,PHP 依然有活力,你不該因為 Node.js 快一些,新一些或新潮一些就去緊跟 Node.js 潮流。PHP 易學而且依然支援專業的程式設計技巧,幫助無處不在而且開發簡單。甚至死忠的 Node.js 開發者也不得不在簡單網站和應用時考慮使用 PHP。

我的建議是:評估選項,根據你的需求來選擇一門語言,這比本文這樣的”對比“文章靠譜得多。

相關文章