核心要點
本文關於從PHP遷移到Go的文章最初發表在其他地方,經作者許可在此轉載。
今年早些時候,我做了一個可以說是糟糕的商業決策:我決定用Go重寫為Boxzilla提供支持的Laravel應用程序。
不過,我並不後悔。
僅僅幾週後,我就部署了Go應用程序。構建它是我幾個月來最快樂的時光,我學到了很多東西,最終結果比舊應用程序有了巨大的改進:性能更好、部署更容易、測試覆蓋率更高。
該應用程序是一個相當簡單的數據庫驅動的API和帳戶區域,用戶可以登錄下載產品、查看發票或更新他們的支付方式。
Stripe和Braintree用於接受訂閱付款。發票使用MoneyBird處理,一些交易電子郵件使用Mailgun發送。
雖然Laravel運行得足夠好,但我總覺得有些事情過於復雜。而且,每隔幾個月就發布一個新的“主要”版本是怎麼回事?如果較新版本包含重大改進,我會很高興,但很多時候,在我看來,它只是對名稱和目錄結構做了一些小的改動。
去年,我已經將幾項服務遷移到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。
並發數
平均延遲
請求/秒
傳輸/秒
不幸的是,一旦我將並發“用戶”數量增加到100以上,Laravel應用程序(或PHP-FPM套接字)就會不斷崩潰。
NetData提供了以下圖表,以查看服務器在這種負載下的承受能力。
Go語言,並發連接數為100
Laravel,並發連接數為100
請注意,我從與應用程序運行相同的機器上運行基準測試,因此這會嚴重影響這兩個圖表。
讓我們比較一下兩個應用程序中的代碼行數,包括所有供應商依賴項。
<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應用程序中,我們主要進行集成測試,以檢查請求處理程序是否返回了正確的響應。總體的測試覆蓋率相當低,這主要是因為緊密耦合,而這反過來主要是我自己的錯。第二次編寫相同的應用程序在這裡也確實有所幫助。
我做了一件你永遠不應該做的事情:因為我感覺像那樣,所以用不同的語言重寫了一個應用程序。結果得到了一個更小、更快的應用程序,並且收穫了很多樂趣。
PHP和Go都是功能強大的編程語言,但它們有一些關鍵區別。 PHP是一種主要用於Web開發的腳本語言,而Go是一種靜態類型編譯語言,旨在提高效率和簡化性。 Go在速度和內存使用方面提供了卓越的性能,並且由於其簡單性和強類型特性,也更容易維護。但是,PHP擁有更大的社區和更多可用的資源,這使得學習和使用它更容易。
考慮從PHP遷移到Go有幾個原因。 Go提供了卓越的性能,這對於需要高速和效率的應用程序至關重要。它也更簡單、更直接,這可以使您的代碼更容易維護。此外,Go對並發編程有很強的支持,這對於某些類型的應用程序來說可能是一個主要優勢。
從PHP遷移到Go的難度會因您對編程概念的熟悉程度以及您學習新語言的意願而異。 Go的設計簡單易懂,但它確實有一些獨特的特性需要一些時間來適應。但是,只要付出一些努力和練習,大多數開發人員都應該能夠完成轉換。
有很多資源可以幫助您學習Go。 Go官方網站提供全面的教程和文檔,並且有許多在線課程和教程可用。此外,Go社區活躍且支持性強,並且有很多論壇和討論組,您可以在那裡提出問題並獲得幫助。
是的,您可以使用Go進行Web開發。 Go有一個內置的net/http包,可以輕鬆構建Web應用程序,並且還有幾個可用於Go的Web框架。但是,請記住,Go是一種通用語言,因此它不像PHP那樣專門用於Web開發。
Go對並發編程有很強的支持,這是它優於PHP的主要優勢之一。 Go的goroutine和通道使得編寫並發代碼變得容易,並且該語言的設計確保了這段代碼的高效性和安全性。相比之下,PHP沒有內置的並發支持,儘管可以使用其他工具和庫來實現。
Go通常比PHP提供更好的性能。它是一種編譯型語言,這意味著它直接在機器的硬件上運行,從而縮短了執行時間。 Go還具有更高效的內存管理系統,這可以降低內存使用量。但是,請記住,對於小型簡單的應用程序,性能差異可能並不明顯。
是的,Go適合大型複雜項目。其簡單性和強類型特性使維護大型代碼庫更容易,其性能特性使其適合高負載應用程序。此外,Go對並發編程的支持對於需要高水平並行性的項目來說可能是一個主要優勢。
PHP擁有更大的社區和更多可用的資源,這使得學習和使用它更容易。但是,Go的社區正在快速發展,並且已經有許多可用於Go的庫和工具。此外,Go的簡單性和性能特性使其在許多科技公司中廣受歡迎,這也有助於其不斷發展的生態系統。
從PHP遷移到Go時可能會遇到一些挑戰,包括學習新的語法和編程範例,適應Go的獨特特性(如goroutine和通道),以及為您的需求找到合適的庫和工具。但是,只要付出一些努力和合適的資源,這些挑戰是可以克服的。
以上是跳到PHP到GO:褻瀆,勇敢還是常識?的詳細內容。更多資訊請關注PHP中文網其他相關文章!