PHP對戰Node.js:我們曾相愛,想到就心酸

2022-02-02 菜鳥教程

整個故事正如好萊塢大片的經典劇情走向:兩位昔日好友如今分道揚鑣,甚至被迫陷入了你死我活的鬥爭當中。剛開始的分歧並不嚴重,無非是一位老友對於另一位夥伴長久以來佔據、但又絕口不提的業務領域產生了點興趣。

而在現實版的這場程式語言決鬥大電影中,Node.js成了那位成了好兄弟反目成仇的導火索,並由此引發一場勢均力敵、旗鼓相當的大戰:PHP與JavaScript,雙方曾一度攜手統治整個網際網路世界,但如今卻為了爭奪開發人員的支持而向對方痛下殺手。

遙想當年,合作關係總是簡單而純粹。那時候JavaScript負責處理瀏覽器上的細枝末節,而PHP則管理著存在於埠80與MySQL之間的全部伺服器端任務。當時雙方保持著愉悅的合作心態,並不斷為網際網路旗下的各種關鍵性部件提供支持。無論是WordPress、Drupal還是Facebook,缺少了PHP、人們在網絡中幾乎一分鐘也待不下去。

然而某位機靈的技術人員發現了一個驚人的秘密:JavaScript也完全能夠運行在伺服器之上。幾乎在一夜之間,我們似乎根本用不著藉助PHP的力量來打造下一代伺服器堆棧了。單憑一種語言,我們已經能夠構建起Node.js以及其它各類運行在客戶機上的框架。「JavaScript無處不在」甚至成為一部分開發人員的工作信仰。

當然,這個故事的結局還沒有敲定。對於每一位到處宣揚Node.js先進性以及JavaScript便捷性的開發人員來說,總有跟自己作對的傢伙存在——他們更傾向於PHP深邃的代碼基礎以及長期穩定的實際表現。那麼這位舊日支配者能夠在自己多年盤踞的伺服器端主場上擊潰挑戰方嗎?JavaScript又是否會無情地推翻自己的老朋友,完成自己的天下一統野心?請大家拿起手中的爆米花桶與可樂,共同觀看這場精彩紛呈的同室操戈好戲。

大家在輸入的過程中當然希望能將自己的思路直接轉化為網站的文本內容,同時還要為進程添加分支、一部分if-then語句以保證站點擁有漂亮的視覺效果,具體取決於URL中的某些參數。又或者,我們希望能夠利用單一資料庫將文本或者數據加以混合。在PHP的幫助下,大家只需要打開魔法般的PHP標籤,幾秒之內即可開始編寫代碼。是的,不需要任何模板——因為一切都已經從屬於模板了!也用不著使用額外的文件或者複雜架構,可編程邏輯的強大力量就在我們的指尖、等待著各位的調遣。

將代碼與內容加以混合像一把神奇的拐杖,雖然開始能夠很好地引導使用者、但最終卻往往變成沉重的負擔。誠然,將代碼與HTML混合在一起確實相當有趣——至少前幾次體驗時是如此。但很多我們的代碼庫就會變成一大堆邏輯相互雜糅的亂麻。

真正的程式設計師會向其中添加結構,並把修飾層從邏輯層當中劃分出來。很明顯,新手開發人員能夠藉此對項目擁有更清晰的認識,也更易於完成後續維護工作。運行在Node.js之上的各類框架正是由這樣一群程式設計師們所打造,他們很清楚當模型、視圖以及控制器得到明確劃分之後,生活會變得更加美好。

整個網絡世界充斥著大量PHP代碼。用於構建網站的各類主流平臺(包括WordPress、Drupal以及Joomla等等)都是由PHP語言所寫就。除了這些平臺之外,大部分相關插件同樣以開原始碼的形式存在。總而言之,PHP代碼可謂唾手可得,等待著大家對其進行下載、修改並根據需要靈活運用。

不可否認,成千上萬的開源PHP文件確實能幫助大家更輕鬆地完成項目開發,但其中也有不少已達八歲高齡的WordPress插件等待並盼望著開發人員將其下載並加以運用。誰願意用幾小時、幾天甚至幾個禮拜時間對這些多年未曾更新的代碼進行調試?至少我不願意。

Node.js插件不僅更加年輕,而且也享受到了最新架構方案所帶來的種種便利。開發這部分代碼的程式設計師們非常清楚,現代Web應用程式應當為客戶端引入更多智能化元素。

PHP語言在使用過程中並沒有太多可說的:幾種變量再加上由字符串與數字構成的基本函數就是它的一切。這是一套非常專注的解決方案,用戶所期望的僅僅是利用它將數據由埠80移動至資料庫及後端當中。PHP沒有太大的野心,能很好地完成這項任務就是它的天職。現代資料庫不啻為一類奇蹟般的工具,因此我們大可以將各類沉重的負載交給它負責處理。PHP是一種複雜程度適中的處理手段,我們根本沒必要刻意讓它變得難以使用。

JavaScript在使用中的一些小彆扭可能會令某些開發人員抓狂,但總體而言這是一套現代程式語言、其中包含大量現代化語法加上以閉包為代表的一系列實用特性。大家可以輕鬆對其進行重新配置與擴展,從而使jQuery等強大的庫成為可能。我們用不著為對象之類的功能而心煩。為什麼要跟自己過不去呢?

大家都說,如果能在瀏覽器以及伺服器上使用同一種語言,那麼實際效果肯定是最好的。但如果我們根本用不著在瀏覽器上使用任何語言,結果豈不是更理想?如果我們能夠直接以HTML格式實現數據輸出呢?瀏覽器能夠直接接納這些數據,而且用不著忍受JavaScript線程嘗試利用幾十次Web服務調用在瀏覽器上創建頁面所引發的各類麻煩與故障。

純HTML往往比其它形式擁有更出色的運行效果,而PHP恰恰針對此類創建任務作出了全面優化。為什麼要費心把JavaScript引入瀏覽器當中?在伺服器上構建一切,並儘量避免把過於繁重的任務交給小手機上的小瀏覽器打理,這才是正確的解決思路。

儘管AJAX常常將大量活動部件塞進HTML 5 Web應用當中,但它們確實很酷——而且極具實效優勢。一旦JavaScript代碼進入瀏覽器緩存,需要在網絡線路間往來傳輸的就只剩下新數據了。在這裡我們不需要面對成噸的HTML標記,而且無需重複下載整個頁面內容。只有其中的數據會發生變化。

如果大家願意花點時間來創建一款精緻的Web應用程式,那麼它絕對能給各位帶來理想的回報。Node.js針對數據交付機製作出了深入優化,而且數據只需要提供給Web服務。如果大家的應用程式非常複雜而且充斥著大量數據,那麼Node.js無疑為信息的有效傳遞建立起良好的基礎。

PHP的設計思路本身就考慮到了與MySQL及其多種變體——例如MariaDB——的共存協作需要。如果MySQL不足以應對大家的實際需求,那麼還有更多來自甲骨文及微軟的其它卓越SQL資料庫可供我們選擇。我們的代碼能夠在經過簡單的發動下轉化為查詢指令。

廣闊的SQL世界可謂一望無際,而且其疆域仍在不斷拓展當中。相當一部分穩定性最出色、開發水準最高的代碼都會與SQL資料庫進行對接,這意味著所有這些強大的能力最終將能被輕鬆集成到PHP項目之內。也許整套生態系統還稱不上完美而又和諧的家族,但其可觀的規模卻絕對不容否認。

如果大家必須接入SQL,那麼Node.js也提供相關庫來完成這項任務。但除此之外,Node.js還能與JSON互通,這套通用方案能夠與眾多最新NoSQL資料庫實現交互。這並不是說我們沒辦法在自己的PHP堆棧中獲得JSON庫,但在將JSON與JavaScript配合使用時、往往能夠帶來簡單便捷的任務處理流程。通過這種方式,我們能夠保證從瀏覽器到Web伺服器再到資料庫全部使用同一種語法,其中冒號與括號的使用方式及作用完全相同。這將幫助大家在節省開發時間之餘,顯著降低代碼編寫時的挫敗感。

對於大部分開發人員而言,利用PHP編寫Web應用程式往往能夠得到更為高效的編碼體驗:用不著編譯器、無需部署、更不用提JAR文件或者預處理機制——只需要利用自己最喜愛的編輯器以及目錄中的部分PHP文件,開發工作就能水到渠成。各位的實際開發流程也許有所不同,但說起快速搞定項目的神兵利器,PHP在這場內鬥中絕對是當仁不讓。

如果從代碼本身的大括號與小括號數量角度來看,編寫JavaScript代碼的難度確實更高一些,但在開發工作結束後、Node.js代碼的運行速度卻極為驚人。回調機制的引入堪稱天才之舉,因為這能大大節約我們處理不同線程的時間。代碼的核心構建良好而且專門設計用於實現我們的實際需要。這不正是每一位開發人員夢寐以求的效果麼?

相關焦點

  • 成為自信的node.js開發者(一)
    只有這樣,我們才能編寫出更加高性能的代碼,在遇到問題時,也知道解決的思路。先來看一張圖表:最上面是我們編寫的node.js的代碼,當我們執行node index.js的命令時,我們是觸發了一個node的程序,和其他的javascript的項目,比如說前端的h5項目一樣,該node程序需要有其他的依賴,其中最主要的兩個依賴是 v8 和 libuv。
  • 如何開發 Node.js Native Add-on?
    開發 Node.js add-on,我們也不斷地為 N-API 和 node-addon-api 添加新的關鍵特性和改進 add-on 開發體驗。曾經 Node.js add-on 只能使用 node-gyp 來構建。對於一些已經在使用 CMake 的庫來說,CMake.js 就是除了 node-gyp 依賴用來構建 add-on 的一個非常吸引人的選項。我們也已經發布了一個使用 CMake 構建 add-on 的例子。
  • Node.js 4.0.0 正式發布了
    Node.js 4.0 最值得關注的改進記錄包括:child_process: ChildProcess.prototype.send() 和 process.send()跨平臺的異步操作作為一個可選的回調參數,可在消息發送時候調用。
  • Node.js 15正式版發布
    英文 | https ://medium.com/@nodejs/node-js-v15-0-0-is-here-deb00750f278前兩天,Node.js
  • Node.js - What's next
    所以讓我們稍微了解一下 Node.js 版本發行的工作流。這是我們去提供 ABI 穩定的 Node.js 和 ABI 穩定所需的 API。而 node-addon-api 提供了封裝了這些 C API 的 C++ 的 API。基本上它只是個語法糖,讓 N-API 使用更加容易。我們一直致力於這兩個工作。
  • node.js「公眾檔所」項目解析
    至於為什麼不要這麼做,就跟 node_modules 文件夾的意義相關了。而且裡面有可能有一些在我本機編譯好的模塊,所以最好還是清理下自己重新裝一遍為佳。具體呢大致就是把 node_modules 文件夾裡面的 alphaRandomer.js 文件和 smpEncoder.js 文件拷貝出來備份到任意文件夾,然後刪除整個 node_module 文件夾。接下去跑到項目根目錄執行
  • 「惹人心酸」的走心文案:我們曾相愛,想到就心酸
    我們曾相愛,想到就心酸。 5.I want to be good enough to smile confidently when I see you again. 我想變足夠好,再見你時可以自信地笑。
  • Docker最全教程之使用Node.js搭建團隊技術文檔站(二十四)
    但是 Node.js 出現之後,前端開發者使用JavaScript就可以前後端通吃了。官方鏡像地址:https://hub.docker.com/_/node使用Node.js編寫一個簡單的Web伺服器非常簡單,主要需要用到http模塊,http模塊主要用於搭建 HTTP
  • Node.js 新計劃:使用 V8 snapshot 將啟動速度提升 8 倍
    在 issue 中 hashseed 寫道:我最近研究了 Node.js 的啟動代碼,我認為我們可以通過使用 V8 snapshot 讓它啟動的更快。我寫了一個設計文檔來解釋幾個要點。設計文檔:Speeding up Node.js startup using V8 snapshot(Google Doc 需科學上網)Node.js 核心的大多數代碼都是使用 JavaScript 實現的。當應用啟動時,Node.js 首先創建 V8::Isolate,其次是 V8::Context,接著才是 node::Environment。
  • Node.js發布2021年第一個安全更新,包括兩個高危漏洞
    近日,Node.js 發布了2021年第一個安全更新,其中包括一個 TLSWrap 的 use-after-free 高危漏洞,可能被利用來破壞內存,從而導致拒絕服務攻擊。
  • Node.js最新技術棧之Promise篇(直播的全部內容)
    技術分享:Node.js最新技術棧之Promise,9月24日(周四)21點分享的內容整理 時間原因,閹割了很多內容,其實內容少點應該更容易理解的,以下是直播的全部內容前言大家好,我是桑世龍,github和cnodejs上的i5ting,目前在天津創業,公司目前使用技術主要是nodejs,算所謂的MEAN(mongodb + express + angular +
  • Node 中文周刊 #10 - Node v17 (Current) 發布了!
    長按識別二維碼查看原文   https://simonplend.com/how-to-cancel-an-http-request-in-node-js/Simon Plenderleith學習如何在Node中實現 OAuth2
  • JavaScript和Underscore.js在PHP中輸入方法 - 智能甄選
    這讓我想到了一個可以為PHP帶來類似JavaScript的開發體驗的庫。最終,使用JavaScript(Underscore除外)方法擴展PHP類型的Extras,解鎖連結,並引入PlainObject代表對象文字的 類型。
  • Node.js爬蟲實戰 - 爬你喜歡的
    實現爬蟲的技術有很多,如python、Node等,今天胡哥給大家分享使用Node做爬蟲:爬取小說網站-首頁推薦小說爬取第一步-確定目標目標網站:https://www.23us.so目標網站我們要獲取排行榜中六部小說的:書名、封面、以及小說書籍信息對應的地址(後續獲取小說完整信息)爬取第二步-分析目標特點網頁的內容是由HTML生成的
  • Ryan Dahl 訪談: Node.js/Deno 的創始人
    我們正在不斷改善Deno,同時我們也在努力將Deno作為基礎架構應用到商業項目中。我們可以很容易地引入另一個類似於NPM的集中式系統,但是最終選擇了基於Web標準URL的連結系統。我們可以非常容易地開放文件系統和網絡,但是這會帶來各種安全漏洞,相反,我們選擇像瀏覽器一樣設計,仔細地管理這些訪問權限。
  • 我們曾經相愛,想到就心酸,心酸的不是因為相愛,而是,曾經
    有時候,我們活得很累,並非生活過於刻薄,而是我們太容易被外界的氛圍所感染,被他人的情緒所左右。其實你是活給自己看的,沒有多少人能夠把你留在心上。直到你不再找我,直到你找不到我,直到最後,你在某一瞬間猛然想起我。可是,那個時候,被你弄丟的我就真的已經不在了,也再不需要你再找回來了。只要你想,那些暗無天日的生活終會離開你,沒有誰天生就該承受那些,何必為了別人委屈了自己。
  • 1月,我們曾相愛,想到就心酸,3星座忘不掉過去,思念生根發芽
    愛情久了,就會不自覺地忽略對方的感受,讓戀人感到不安全,這種性格也只有經歷了感情的失敗,才會逐漸成熟,當他們失去所愛的人時,才會明白彼此在心中的重要性,一月份,我們曾經相愛,想到就心酸,但射手座忘記不了過去,思念生根發芽。
  • 我們曾相愛,想到就心酸——張愛玲和桑弧
    幾番查無實證,自然不好做有罪推斷,加上感情線索集中的劇情更為好看,這段糾葛久之便無人追究。要不是一部《小團圓》橫空出世,誰能想像桑弧的守口如瓶之後另有隱情?誰能想到在胡蘭成之後,在賴雅之前,張愛玲還另有一段如冷泉幽咽如雨意闌珊的愛戀?《小團圓》裡那個男子叫燕山,出現在以胡蘭成為原型的邵之雍之後,這也正是桑弧在張愛玲出場的時間。
  • 致前任:曾經的我們曾那麼相愛,一切隨風,只是想到依舊會心酸!
    01曾有一位情感達人說過這樣一句話:「我認真談過一段戀愛,我們最終卻分手了,從那之後,我很難再去喜歡別人,我不想花時間,也不想釋懷去了解。」「燕子,你幹嘛沉默不語,不拒絕也不答應?看得出來,你對我有好感的!」「我對你只是呵護,別想多了,你應該去追求哪些比你年輕的女孩。」
  • Node.js對Java:一場史詩級的爭奪開發者注意力的對決
    人們曾嘗試出售過小應用程式和 Java 工具的強大,但是表現平平。而伺服器成為了 Java 的最佳領域。同時,之前被程式設計師們錯認為是 Java「雙胞胎」的 JavaScript,如今也能獨擋一面了。在 HTML 和 web 推出 Borg 的幾年間,JavaScript 一直緊隨其後,AJAX 的出現使得 JavaScript 突然之間擁有了力量,打破了之前的局面。