搜尋
首頁後端開發php教程跳到PHP到GO:褻瀆,勇敢還是常識?

Jumping from PHP to Go: Blasphemy, Bravado or Common Sense?

核心要點

  • 將Boxzilla應用的底層Laravel應用從PHP遷移到Go,最終得到一個更高效的程序,具有更好的性能、更簡單的部署和更高的測試覆蓋率,儘管最初對潛在的業務風險有所擔憂。
  • Go是一種編譯型語言,其標準庫優於PHP,即使考慮外部依賴項,也能生成更快、更小的應用程序,代碼行數更少。從PHP到Go的轉換需要適應新的語法和特性,但最終結果被認為是值得的。
  • 儘管PHP擁有更大的社區和豐富的資源,但Go日益普及、簡單易用以及卓越的性能特性使其成為開發人員考慮轉換的有力競爭者。作者預測,未來將會有大量開發人員從PHP、Python和JavaScript等動態類型語言遷移到Go。

本文關於從PHP遷移到Go的文章最初發表在其他地方,經作者許可在此轉載。


Jumping from PHP to Go: Blasphemy, Bravado or Common Sense?

今年早些時候,我做了一個可以說是糟糕的商業決策:我決定用Go重寫為Boxzilla提供支持的Laravel應用程序。

不過,我並不後悔。

Jumping from PHP to Go: Blasphemy, Bravado or Common Sense?

僅僅幾週後,我就部署了Go應用程序。構建它是我幾個月來最快樂的時光,我學到了很多東西,最終結果比舊應用程序有了巨大的改進:性能更好、部署更容易、測試覆蓋率更高。

該應用程序是一個相當簡單的數據庫驅動的API和帳戶區域,用戶可以登錄下載產品、查看發票或更新他們的支付方式。

Stripe和Braintree用於接受訂閱付款。發票使用MoneyBird處理,一些交易電子郵件使用Mailgun發送。

雖然Laravel運行得足夠好,但我總覺得有些事情過於復雜。而且,每隔幾個月就發布一個新的“主要”版本是怎麼回事?如果較新版本包含重大改進,我會很高興,但很多時候,在我看來,它只是對名稱和目錄結構做了一些小的改動。

為什麼選擇Go?

去年,我已經將幾項服務遷移到Go,所以我對這門語言並不完全陌生。作為一名銷售基於WordPress產品的開發者,我的工作一部分是處理一個古老的技術棧,該技術棧主要關注最終用戶。

如果我不是個體經營者,我會申請一份新工作來彌補這種缺乏“性感”技術的不足。作為自己的老闆,我有責任讓我的日常工作變得有趣,而不僅僅是追求更直接的收益。如果收入允許(而且確實允許),為什麼不享受一下樂趣呢?

編寫Go代碼是一件令人愉快的事情,其工具令人驚嘆,不僅開發速度快,最終結果通常也快得令人難以置信。僅僅閱讀Go項目的用途就讓我愛上了這門語言。

我認為在未來幾年,我們將看到相當多的人從PHP、Python和JavaScript等動態類型語言轉向Go。

代碼庫移植

將代碼遷移到Golang主要包括正確地進行數據庫交互以及將Blade模板移植到我們可以在Go中使用的某種東西。

ORM總是會妨礙我,所以我選擇了可模擬的數據訪問層和普通的SQL查詢。 Meddler用於消除掃描查詢結果到結構體的一些樣板代碼。

為了支持分層模板和部分模板,我開源了grender,這是一個圍繞Go的標準html/template包的小型包裝器。這使我能夠相對輕鬆地將Blade模板文件移植到Go,因為我可以使用相同的層次結構和部分模板。

對於與Stripe集成,有官方的stripe-go包。對於Braintree,有非官方的braintree-go包,該包曾被忽略了一段時間,但最近受到了新的關注。由於還沒有Go包來管理Moneybird中的發票,我構建並開源了moneybird-go。

比較蘋果和橘子

由於Go是一種編譯型語言,其標準庫比PHP好得多,所以我即將進行的兩種語言的比較並不公平。也就是說,我認為分享一些數字會很有趣。

性能

wrk用於對兩個應用程序執行一些簡單的HTTP基準測試,返回登錄頁面的HTML。

並發數 平均延遲 請求/秒 傳輸/秒

Laravel 1 3.87ms 261.48 1.27MB Laravel 100 108.86ms 917.27 6.04MB Go 1 325.72μs 7365.48 34.27MB Go 100 11.63ms 19967.31 92.91MB Go 200 37.68ms 22653.22 105.41MB

不幸的是,一旦我將並發“用戶”數量增加到100以上,Laravel應用程序(或PHP-FPM套接字)就會不斷崩潰。

NetData提供了以下圖表,以查看服務器在這種負載下的承受能力。

Go語言,並發連接數為100 Jumping from PHP to Go: Blasphemy, Bravado or Common Sense?

Laravel,並發連接數為100 Jumping from PHP to Go: Blasphemy, Bravado or Common Sense?

請注意,我從與應用程序運行相同的機器上運行基準測試,因此這會嚴重影響這兩個圖表。

代碼行數

讓我們比較一下兩個應用程序中的代碼行數,包括所有供應商依賴項。

<code>find . -name '*.php' | xargs wc -l
156289 total
</code>

Laravel版本包含超過156,000行代碼。這還不包括開發依賴項,對於Laravel來說,這些依賴項是運行測試等所必需的。

<code>find . -name '*.go' | xargs wc -l
33624 total
</code>

另一方面,Golang版本包含33,000行代碼。這只是相同功能代碼的五分之一。

讓我們排除Laravel應用程序中的外部依賴項,以便我們知道我實際編寫了多少行代碼。

<code>find . -name '*.php' -not -path "./vendor/*" | xargs wc -l
13921 total
</code>

對於Golang。

<code>find . -name '*.go' -not -path "./vendor/*" | xargs wc -l
6750 total
</code>

如果只查看管理的代碼行數,結果會更均衡一些。儘管如此,它仍然是具有相同功能的應用程序,代碼量減少了一半。

測試覆蓋率

在Golang中,測試是一等公民,測試文件位於實際源文件旁邊。

<code>license.go
license_test.go
subscription.go
subscription_test.go</code>

這使得應用測試驅動開發非常方便。

在我們的Laravel應用程序中,我們主要進行集成測試,以檢查請求處理程序是否返回了正確的響應。總體的測試覆蓋率相當低,這主要是因為緊密耦合,而這反過來主要是我自己的錯。第二次編寫相同的應用程序在這裡也確實有所幫助。

TLDR

我做了一件你永遠不應該做的事情:因為我感覺像那樣,所以用不同的語言重寫了一個應用程序。結果得到了一個更小、更快的應用程序,並且收穫了很多樂趣。

關於從PHP遷移到Go的常見問題

PHP和Go的主要區別是什麼?

PHP和Go都是功能強大的編程語言,但它們有一些關鍵區別。 PHP是一種主要用於Web開發的腳本語言,而Go是一種靜態類型編譯語言,旨在提高效率和簡化性。 Go在速度和內存使用方面提供了卓越的性能,並且由於其簡單性和強類型特性,也更容易維護。但是,PHP擁有更大的社區和更多可用的資源,這使得學習和使用它更容易。

為什麼我應該考慮從PHP遷移到Go?

考慮從PHP遷移到Go有幾個原因。 Go提供了卓越的性能,這對於需要高速和效率的應用程序至關重要。它也更簡單、更直接,這可以使您的代碼更容易維護。此外,Go對並發編程有很強的支持,這對於某些類型的應用程序來說可能是一個主要優勢。

從PHP遷移到Go有多難?

從PHP遷移到Go的難度會因您對編程概念的熟悉程度以及您學習新語言的意願而異。 Go的設計簡單易懂,但它確實有一些獨特的特性需要一些時間來適應。但是,只要付出一些努力和練習,大多數開發人員都應該能夠完成轉換。

有哪些資源可以幫助我學習Go?

有很多資源可以幫助您學習Go。 Go官方網站提供全面的教程和文檔,並且有許多在線課程和教程可用。此外,Go社區活躍且支持性強,並且有很多論壇和討論組,您可以在那裡提出問題並獲得幫助。

我可以像使用PHP一樣使用Go進行Web開發嗎?

是的,您可以使用Go進行Web開發。 Go有一個內置的net/http包,可以輕鬆構建Web應用程序,並且還有幾個可用於Go的Web框架。但是,請記住,Go是一種通用語言,因此它不像PHP那樣專門用於Web開發。

與PHP相比,Go如何處理並發?

Go對並發編程有很強的支持,這是它優於PHP的主要優勢之一。 Go的goroutine和通道使得編寫並發代碼變得容易,並且該語言的設計確保了這段代碼的高效性和安全性。相比之下,PHP沒有內置的並發支持,儘管可以使用其他工具和庫來實現。

PHP和Go的性能差異是什麼?

Go通常比PHP提供更好的性能。它是一種編譯型語言,這意味著它直接在機器的硬件上運行,從而縮短了執行時間。 Go還具有更高效的內存管理系統,這可以降低內存使用量。但是,請記住,對於小型簡單的應用程序,性能差異可能並不明顯。

Go是否適合大型複雜項目?

是的,Go適合大型複雜項目。其簡單性和強類型特性使維護大型代碼庫更容易,其性能特性使其適合高負載應用程序。此外,Go對並發編程的支持對於需要高水平並行性的項目來說可能是一個主要優勢。

Go的社區和生態系統與PHP的相比如何?

PHP擁有更大的社區和更多可用的資源,這使得學習和使用它更容易。但是,Go的社區正在快速發展,並且已經有許多可用於Go的庫和工具。此外,Go的簡單性和性能特性使其在許多科技公司中廣受歡迎,這也有助於其不斷發展的生態系統。

從PHP遷移到Go時可能會遇到哪些挑戰?

從PHP遷移到Go時可能會遇到一些挑戰,包括學習新的語法和編程範例,適應Go的獨特特性(如goroutine和通道),以及為您的需求找到合適的庫和工具。但是,只要付出一些努力和合適的資源,這些挑戰是可以克服的。

以上是跳到PHP到GO:褻瀆,勇敢還是常識?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
高流量網站的PHP性能調整高流量網站的PHP性能調整May 14, 2025 am 12:13 AM

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

PHP中的依賴注入:初學者的代碼示例PHP中的依賴注入:初學者的代碼示例May 14, 2025 am 12:08 AM

你應該關心DependencyInjection(DI),因為它能讓你的代碼更清晰、更易維護。 1)DI通過解耦類,使其更模塊化,2)提高了測試的便捷性和代碼的靈活性,3)使用DI容器可以管理複雜的依賴關係,但要注意性能影響和循環依賴問題,4)最佳實踐是依賴於抽象接口,實現鬆散耦合。

PHP性能:是否可以優化應用程序?PHP性能:是否可以優化應用程序?May 14, 2025 am 12:04 AM

是的,優化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)優化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,並避免使用

PHP性能優化:最終指南PHP性能優化:最終指南May 14, 2025 am 12:02 AM

theKeyStrategiestosigantificallyBoostPhpaPplicationPerformenCeare:1)UseOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)優化AtabaseInteractionswithPreparedStateTementStatementStatementAndProperIndexing,3)配置

PHP依賴注入容器:快速啟動PHP依賴注入容器:快速啟動May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強codemodocultion,可驗證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP中的依賴注入與服務定位器PHP中的依賴注入與服務定位器May 13, 2025 am 12:10 AM

選擇DependencyInjection(DI)用於大型應用,ServiceLocator適合小型項目或原型。 1)DI通過構造函數注入依賴,提高代碼的測試性和模塊化。 2)ServiceLocator通過中心註冊獲取服務,方便但可能導致代碼耦合度增加。

PHP性能優化策略。PHP性能優化策略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)啟用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替換loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

PHP電子郵件驗證:確保正確發送電子郵件PHP電子郵件驗證:確保正確發送電子郵件May 13, 2025 am 12:06 AM

phpemailvalidation invoLvesthreesteps:1)格式化進行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。