「入群交流:Go中文网 QQ群:731990104 微信群:274768166 备注:头条 Go语言中文网」

在过去的十年中,无论是世界 500 强企业或是仅拥有 500 名用户的企业,我的团队都曾为他们开发过软件。在此期间,我的工程团队主要使用 PHP 进行后端开发。2 年前,我们在开发项目中引入了一些东西,这不仅彻底改变了我们产品的性能,也改变了它们的可扩展性————我们将 Golang 引入到我们的开发框架中。

很快,我们发现 Golang 的引用使得我们能够为客户设计更大型,速度提高 40 倍的应用程序。我们可以利用 Go 的强大功能来增强我们用 PHP 编写的产品,并充分利用这两种语言的优劣进行取长补短。

我将解释如何结合 Golang 和 PHP 这两种语言解决实际开发中的问题,这将为你的 PHP 开发带来全新的道路,以此解决垂死的 PHP 模型 相关的一些问题。

首先介绍常用的 PHP 设置

在回答我们如何使用 Golang 来将 PHP 起死回生之前,我们先介绍一下标准的 PHP 设置。

在大多数情况下,PHP 开发者会使用 nginx Web-serverphp-fpm 服务器组合运行应用程序。当 php-fpm 执行 PHP 代码时,Nginx 提供静态文件并将特定请求转发到 php-fpm 。也可以将 Apachemod_php 一起使用。即使这种工作方式和上面那种略有不同,但它们的原理还是类似的。

在此需求的实现中,我们使用有缓冲的通道 来存储活动工作池。

最终结果是一个能够处理任意二进制作业的有效 PHP 服务器。

为了使我们的应用程序能作为 Web 服务器工作,我们必须选择一个可靠的 PHP 标准来表示任何 HTTP 传入请求。想要满足此需求,我们只需将 Golang net / HTTP 请求转换为 PSR-7https://www.php-fig.org/psr/psr-7/meta/)格式,使其与大多数市场上的 PHP 框架兼容。

由于 PSR-7 格式是不可变的(一些工程师可能会指出它在技术上不可变),它迫使开发人员编写不再将请求视为全局实体的应用程序。这完全符合长期运行 PHP 进程的想法。最终实现看起来流程如下:

golang 和php 并发能力对比(GCTT出品PHP)(1)

介绍 RoadRunner- 一个高性能的 PHP 应用服务器

我们最初的测试用例是一个用于后端的 API,它经常难以预测的出现突发请求的次数比平时高出许多倍的情况。虽然在大多数情况下 nginx 可以帮忙处理,但是出现 502 错误的情况会频繁发生,因为我们无法预料到什么时候负载增加,做不到在负载增加之前快速地平衡系统。

在 2018 年初,我们将第一个 PHP / Golang 应用服务器部署到市场中以取代此设置。效果立竿见影,令人难以置信。我们不仅完全消除了 502 错误的发生,而且我们最终将服务器总数减少了近三分之二,这为工程师们和产品所有者节省了大量工作成本和服务器成本。

到 2018 年中期,我们对该方法进行了优化,并在 MIT 许可下将其发布到 GitHub,并称之为 RoadRunner,它实现了其令人难以置信的速度和效率。

RoadRunner 如何帮助开发

RoadRunner 引入我们的技术栈使我们能够使用中间件进行 HTTP 通信,在请求进入 PHP 之前启用 JWT 验证,处理 WebSockets 并将统计数据汇总到 Prometheus 中。通过使用嵌入式 RPC,我们可以将任何 Golang 库中的 API 传递给 PHP 使用,而无需自定义驱动程序。最重要的是,我们可以使用 RoadRunner 库来设置与 HTTP 不同的新服务器。示例包括在 PHP 中运行 AWS Lambda 处理程序,创建可靠的队列使用,甚至将 GRPC 添加到我们的应用程序中。

到目前为止,在 PHP 和 Golang 开发社区的共同帮助下,我们改进了调试工具,将其与 Symfony 框架集成,并增加了对 HTTPS,HTTP / 2,和 PSR-17 的处理。我们提高了程序的稳定性,并且在一些测试中,程序的性能提高了 40 倍之多。

结论

有些人仍然坚持认为 PHP 是一种缓慢,笨重的语言,只能用来编写 WordPress 插件。他们甚至可能会说 PHP 有一个限制:一旦你的应用程序变得比较大,你就必须切换到更“成熟”的语言并取代之前的 PHP 代码。

对他们来说,我们想说“请三思”。我们认为 PHP 的唯一限制是你自己给自己的限定。你可以花一生的时间从一种语言跳到另一种语言,试图找到满足你编程需求的“完美匹配”,或者你可以开始将语言本身重新设想为工具。像 PHP 这样的编程语言的表面缺点实际上可能是其成功的关键。通过将其与 Go 等其他语言配对,你最终可以创建比你自己使用任何一种语言更强大的产品。

在使用 Go 和 PHP 进行混合编程一段时间之后,我们可以自信地说我们都很喜欢这种开发方式。我们不打算放弃,而且我们将继续寻找从这种双栈编程中获得最高效率的方法。

Spiral Scout 是一家领先的软件开发公司,为旧金山和美国各地的客户提供从小型网站到大型分布式系统的定制产品的全栈开发。如果你有 PHP 或 Golang 相关项目,或者你遇到了应用程序在 PHP 中无法扩展或被过时的代码压缩限制,请通过spiralscout.com 与我们的团队联系

RoadRunner Creator: Anton Titov, CTO, Spiral Scout


via: https://blog.spiralscout.com/php-was-never-meant-to-die-830de87915ee

本文由 GCTT 原创编译,Go语言中文网 荣誉推出

  • 本文由 GCTT 原创翻译,Go语言中文网 首发。也想加入译者行列,为开源做一些自己的贡献么?欢迎加入 GCTT!
  • 翻译工作和译文发表仅用于学习和交流目的,翻译工作遵照 CC-BY-NC-SA 协议规定,如果我们的工作有侵犯到您的权益,请及时联系我们。
  • 文章仅代表作者的知识和看法,如有不同观点,请评论排队吐槽
,