跳到PHP到GO:亵渎,勇敢还是常识?
核心要点
- 将Boxzilla应用的底层Laravel应用从PHP迁移到Go,最终得到一个更高效的程序,具有更好的性能、更简单的部署和更高的测试覆盖率,尽管最初对潜在的业务风险有所担忧。
- Go是一种编译型语言,其标准库优于PHP,即使考虑外部依赖项,也能生成更快、更小的应用程序,代码行数更少。从PHP到Go的转换需要适应新的语法和特性,但最终结果被认为是值得的。
- 尽管PHP拥有更大的社区和丰富的资源,但Go日益普及、简单易用以及卓越的性能特性使其成为开发人员考虑转换的有力竞争者。作者预测,未来将会有大量开发人员从PHP、Python和JavaScript等动态类型语言迁移到Go。
本文关于从PHP迁移到Go的文章最初发表在其他地方,经作者许可在此转载。
今年早些时候,我做了一个可以说是糟糕的商业决策:我决定用Go重写为Boxzilla提供支持的Laravel应用程序。
不过,我并不后悔。
仅仅几周后,我就部署了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。
并发数
平均延迟
请求/秒
传输/秒
不幸的是,一旦我将并发“用户”数量增加到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应用程序中,我们主要进行集成测试,以检查请求处理程序是否返回了正确的响应。总体的测试覆盖率相当低,这主要是因为紧密耦合,而这反过来主要是我自己的错。第二次编写相同的应用程序在这里也确实有所帮助。
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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...
