網絡正在處於一個突飛猛進的發展時代。服務器端開發人員在選擇語言的時候很是困惑,有長期占主導地位的語言,例如C、Java和Perl,也有專一於web開發的語言,例如Ruby、Clojure和Go。只要你的項目運行良好,你的選擇就顯得沒有那麼重要了。javascript
可是如何讓這些新的web開發人員作出一個正確的選擇呢?php
我不但願展開一場PHP、NodeJs兩大陣營之間的戰爭,我將會對比這兩種語言所在領域的發展情況:html
PHP
Rasmus Lerdorf在1994年創造出了PHP。它是由安裝在web服務器(Apache、Ngix)上的組件運行的。java
PHP代碼能夠和HTML混合到一塊。 對於初學者就能很快寫出頗有價值的代碼,這並不須要太多的練習。 這讓PHP變得愈來愈流行, 如今全球百分之八十的服務器上都在運行着PHP。全球四分之一的網站都在用的一個內容管理系統--WordPress,就是用PHP寫的。node
Node.js
Ryan Dahl在2009年創造了Node.js。它是基於Google的V8 JavaScript解釋引擎(在Chrome瀏覽器裏它負責執行客戶端的JavaScript代碼)。與其它語言不一樣的是Node.js內置了處理網絡請求和響應的函數庫,因此你不須要單獨的服務器(Apache、Ngix)或者其餘依賴。git
Node.js雖然很新可是很快就得到了極大的追捧。在不少的大公司都有在使用,例如:Microsoft,Yahoo,LinkedIn和PayPal。程序員
若是文章裏邊比較瞭如上全部語言的各類參數,文章將會很是長,你還會讀它麼?你指望一個程序員瞭解全部的程序開發語言嗎?這顯然是不可能的。我主要對PHP和Node.js作了比較,主要緣由以下:github
首先它們之間值得比較。二者都是開放源碼,都是致力於web開發,而且均可用於類似的項目。web
PHP已經發布了好久了,可是Node.js纔剛剛興起,並受到愈來愈多的關注。難道PHP的程序員應該相信Node.js的宣傳?應該考慮轉換語言?chrome
我瞭解,熱愛編程語言,自從20世紀90年代以後我就一直使用PHP和JavaScript,而且也有幾年的Node.js的經驗。除此以外我也涉獵了其餘的技術,可是在這裏我還不能對他們做出客觀評價。
另外,對多少語言作比較不重要,由於總會有某些地方的某些人抱怨我沒有提到他們語言。
程序員會花費不少時間來提高他們本身的編程能力。一些人有編程語言之間的延伸能力,可是這些達到更高層次的人根據不少的因素來作出他們本身的選擇。從主觀方面來講,你將會推動而且捍衛你的技術決策。
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 勝。理由以下:
JavaScript 是世界上最難理解的語言 — 可是,當哪天你頓悟之後,概念一通,就會發現其餘語言都太過笨拙了。
JavaScript 代碼比 PHP 簡潔。例如,你再不須要跟 JSON 轉來轉去—— UTF-8 也不用
全棧工程師能夠同時在客戶端與服務端使用 JavaScript 。大腦不須要來回切換。
深刻理解 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 ,可是這已經不是語言的標準特性了。
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。
個人建議是:評估選項,根據你的需求來選擇一門語言,這比本文這樣的」對比「文章靠譜得多。
原文地址:http://www.sitepoint.com/sitepoint-smackdown-php-vs-node-js/