Node.js 與 PHP:理解服務(wù)器端開發(fā)
譯文【51CTO.com快譯】選擇合適的語言、框架、庫和數(shù)據(jù)庫工具包是成功執(zhí)行項(xiàng)目的第一步。雖然了解每個(gè)工具的優(yōu)缺點(diǎn)是執(zhí)行這種比較分析的合理途徑,但如果前端和后端開發(fā)團(tuán)隊(duì)了解適當(dāng)?shù)毓ぞ?,工作效率?huì)大大很多。
服務(wù)器端開發(fā)對(duì)于設(shè)計(jì)基于web的功能性和流動(dòng)性產(chǎn)品(網(wǎng)站、應(yīng)用程序或原生web應(yīng)用程序)至關(guān)重要??蛻舳碎_發(fā)涉及用戶體驗(yàn)和信息的布局方式。服務(wù)器端開發(fā)負(fù)責(zé)高效組織和訪問存儲(chǔ)在數(shù)據(jù)庫和 Web 應(yīng)用程序中的數(shù)據(jù),使用靜態(tài)資源(如 CSS 和 JavaScript 或 HTML 模板)甚至數(shù)據(jù)進(jìn)行訪問。
因此,在為開發(fā)下一個(gè)項(xiàng)目時(shí),了解服務(wù)器端開發(fā)的基本要求至關(guān)重要。
一、服務(wù)端開發(fā)的基本要求
1. 投入產(chǎn)出模型
無論使用何種語言、框架和庫進(jìn)行開發(fā),基本流程或多或少都保持不變。使用的系統(tǒng)調(diào)用,始終與內(nèi)核交互。
系統(tǒng)調(diào)用負(fù)責(zé)向內(nèi)核提供請(qǐng)求,內(nèi)核在設(shè)備級(jí)別執(zhí)行這些請(qǐng)求。這種安排確保所有特定于設(shè)備的計(jì)算都在內(nèi)核級(jí)別完成,并且應(yīng)用程序不必處理過多的計(jì)算負(fù)載。
2. 阻塞與非阻塞調(diào)用
系統(tǒng)調(diào)用通常被確定為阻塞調(diào)用。“阻塞”是指內(nèi)核等待返回結(jié)果或信息的時(shí)間。例如,內(nèi)核可能會(huì)等待設(shè)備準(zhǔn)備好進(jìn)行計(jì)算,或等待訪問某些設(shè)備數(shù)據(jù)等。這些挑戰(zhàn)會(huì)導(dǎo)致阻塞調(diào)用,就意味著指令在幾毫秒內(nèi)不會(huì)執(zhí)行完畢。
非阻塞調(diào)用對(duì)工程師來說更復(fù)雜,但可以節(jié)省關(guān)鍵的計(jì)算資源。對(duì)于這種安排,可以命令內(nèi)核在必要的數(shù)據(jù)可用時(shí)發(fā)出警報(bào),同時(shí)將請(qǐng)求放入隊(duì)列中。其他可以立即執(zhí)行的功能會(huì)立即執(zhí)行。
3. 調(diào)度
如果正在創(chuàng)建一個(gè)全面的產(chǎn)品,在某些時(shí)候,線程和進(jìn)程的數(shù)量將達(dá)到臨界質(zhì)量,將不得不為調(diào)度提供更多的考慮。用最簡單的術(shù)語來說,調(diào)度是上下程序切換,允許一個(gè)線程接著一個(gè)線程或一個(gè)進(jìn)程接著一個(gè)進(jìn)程執(zhí)行的步驟。
如果有太多的阻塞調(diào)用,那么在數(shù)千個(gè)線程和進(jìn)程之間切換聚合所花費(fèi)的時(shí)間可能會(huì)成為一個(gè)重要問題。這就是為什么盡可能使用非阻塞調(diào)用來確保異步處理的原因。
二、Node與 PHP:服務(wù)器端開發(fā)語言環(huán)境
Node.js 和 PHP 通常被認(rèn)為是最適合服務(wù)器端軟件開發(fā)的兩種最理想的語言。本節(jié)將使用案例進(jìn)行演示,以了解 Node.js 和 PHP 的配置文件。
Node.js
Node.js由 Ryan Dahl 開發(fā)并于 2009 年 5 月發(fā)布。它是一個(gè)開源運(yùn)行時(shí)環(huán)境,從一開始就具有成本效益。Node.js支持異步開發(fā),這意味著它利用非阻塞系統(tǒng)調(diào)用使開發(fā)過程資源充沛。使用 Node.js 的最顯著優(yōu)勢(shì)之一是,由于只使用JavaScript,所以整個(gè)項(xiàng)目可以在開發(fā)時(shí)間線中僅使用一種語言。運(yùn)行時(shí)還附帶了幾個(gè)Node.js 框架,用于添加功能。
PHP
PHP代表超文本預(yù)處理器。它于 1994 年由拉斯穆斯·勒多夫 (Rasmus Lerdorf) 發(fā)布。雖然與 Node.js 相比,它是一種較舊的語言,但 PHP 可用于整個(gè)項(xiàng)目的服務(wù)器端開發(fā)和其他開發(fā)過程。由于它可以與JavaScript、HTML、CSS 和純文本一起使用,因此它在支持的底層語言方面的約束性較少。
市場(chǎng)趨勢(shì)
應(yīng)評(píng)估兩種備選方案的受歡迎程度以了解:
• 人才的供應(yīng)有助于項(xiàng)目的開發(fā)和維護(hù)。
• 與備選方案相關(guān)的社區(qū)和圖書館提供的支持。
• 可比項(xiàng)目中常用的替代方案。這些項(xiàng)目自完成上線以來,它們已經(jīng)承擔(dān)了迭代的成本。
此信息可用作評(píng)判標(biāo)準(zhǔn),以決定對(duì)于 Web 開發(fā)公司來說,Node.js 和 PHP 之間哪個(gè)可能是更佳選擇。
三、了解 Node.js 和 PHP 在服務(wù)器端開發(fā)中的對(duì)比
為了更好地構(gòu)建 Node.js 和 PHP 之間的分析框架,應(yīng)該查看并發(fā)性、可擴(kuò)展性和性能等特定標(biāo)準(zhǔn)。Node.js 和 PHP 都易于安裝,并隨其框架或包管理系統(tǒng)一起提供。因此,比較安裝過程在這里并不是最重要的。
1.并發(fā)性
并發(fā)性顯示了服務(wù)器端語言或運(yùn)行時(shí)高效執(zhí)行多個(gè)線程和進(jìn)程的效率。PHP 是一種同步語言,使用 I/O 塊調(diào)用。雖然一些依賴于 PHP 的插件和工具具有異步執(zhí)行,但是占比很少。雖然 PHP 庫已經(jīng)針對(duì)更快的性能和更少的計(jì)算資源消耗進(jìn)行了優(yōu)化,但不得不承認(rèn),由于是同步的原因,速度則會(huì)相對(duì)較慢。
Node.js 是一個(gè)異步環(huán)境。這意味著當(dāng)系統(tǒng)調(diào)用到達(dá)內(nèi)核時(shí),查詢被解析。所有需要更多數(shù)據(jù)、文件或系統(tǒng)訪問權(quán)限的調(diào)用都會(huì)排隊(duì)并稍后執(zhí)行,而不會(huì)妨礙其他可以完成的功能。這是對(duì)異步環(huán)境的簡單解釋,但它仍然準(zhǔn)確地說明了該現(xiàn)象的核心含義。
2. 可擴(kuò)展性
可擴(kuò)展性表明了隨著項(xiàng)目功能和數(shù)據(jù)數(shù)量以及用戶數(shù)量方面的增長,服務(wù)器端腳本語言或運(yùn)行時(shí)環(huán)境可以跨多個(gè)系統(tǒng)、核心和服務(wù)器進(jìn)行擴(kuò)展。
大多數(shù)主要的內(nèi)容管理系統(tǒng)(如 WordPress 和 Joomla)都支持 PHP。這使得縮放過程相對(duì)更簡單。另一方面,Node.j在跨系統(tǒng)擴(kuò)展時(shí)需要付出相對(duì)更多的努力。
3. 性能
Node.js 是一個(gè)性能更好的運(yùn)行時(shí)環(huán)境,因?yàn)樗钱惒降?,?ReactPHP 可以填補(bǔ) PHP 和 Node.js 之間的性能差距。
根據(jù)經(jīng)驗(yàn),與 Node.js 相比,PHP 每秒只能執(zhí)行 50% 的查詢。
4. 使用 PHP 或 Node.js 的理想場(chǎng)景
如果項(xiàng)目需要速度或?qū)崟r(shí)數(shù)據(jù)流,Node.js 將是兩種服務(wù)器端語言之間的首選選項(xiàng)。對(duì)于想要在整個(gè)堆棧中使用 JavaScript 的團(tuán)隊(duì)來說,Node.js 也是一個(gè)很好的替代方案。
當(dāng)希望項(xiàng)目具有可移植性時(shí),PHP 是理想的選擇。當(dāng)已擁有集中式服務(wù)器基礎(chǔ)架構(gòu)時(shí),它也是一個(gè)不錯(cuò)的選擇。
四、對(duì)比分析
Node.js | PHP |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
五、總結(jié)
Node.js 開發(fā)公司可能更喜歡運(yùn)行時(shí)環(huán)境,而那些精通 PHP 的公司則更喜歡服務(wù)器端腳本語言。使用更客觀的方法,可以看出項(xiàng)目的理想語言或運(yùn)行時(shí)環(huán)境將取決于項(xiàng)目的目的和約束。雙方都有大公司——Facebook、維基百科、Slack、MailChimp 和 WordPress 使用 PHP,而 Netflix、LinkedIn、PayPal 和 NASA 使用 Node.js。
因此,您不應(yīng)該比較哪種服務(wù)器端JavaScript語言總體上是好的,而應(yīng)該嘗試檢查這兩種語言中的哪一種適合您的特定項(xiàng)目、目標(biāo)和約束
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】