首页 >后端开发 >php教程 >跳到PHP到GO:亵渎,勇敢还是常识?

跳到PHP到GO:亵渎,勇敢还是常识?

Joseph Gordon-Levitt
Joseph Gordon-Levitt原创
2025-02-10 11:51:24267浏览

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