Hacker News 中文摘要

RSS订阅

混合PHP的崛起:PHP与Go和Rust的融合 -- The Rise of Hybrid PHP: Blending PHP with Go and Rust

文章摘要

随着PHP生态系统的新能力和强大库的兴起,开发者现在可以更容易地在单体应用中保留更多逻辑,同时通过混合使用Go和Rust等技术来优化性能。这种混合方法不仅减少了复杂性和操作开销,还能在保持开发速度和稳定性的同时,高效处理高流量请求。

文章总结

混合PHP的崛起:PHP与Go和Rust的结合

过去,我们通常将应用程序开发为一个单一的DDD单体(称为“母体”),并围绕它构建几个较小的微服务(称为“子体”),以获得特定的优势。这些微服务大多使用Go开发,而核心单体服务则基于PHP 8.3构建。

这种技术栈长期以来表现良好。Go微服务高效处理了我们的高吞吐量请求,而精心设计的单体服务使我们相对较小的后端团队能够快速且自信地交付功能。这是一个良好的平衡:在最需要的地方追求速度,而在其他地方保持稳定性和生产力。

正如许多人可能经历过的那样,80%的流量通常只针对20%的API——这是著名的帕累托原则。不出所料,这些热门的20%端点通常是性能最关键的地方。过去,我们的策略包括编写高度优化的代码、添加极端的缓存层,或将某些部分提取到基于Go的微服务中。虽然有效,但这些方法增加了复杂性和操作开销。

如今,得益于PHP生态系统的新功能和强大库及运行时的兴起,在保持更多逻辑在单体内部的同时实现卓越性能变得更加容易。以下是几种令人兴奋的选择:

1. FFI(外部函数接口)

PHP的FFI功能允许你直接从PHP调用C代码。这为系统级操作或性能关键逻辑打开了大门,而无需离开PHP项目。当然,你需要注意上下文切换成本,但在合适的用例中,这是一个改变游戏规则的功能。

2. 基于Rust的扩展

如果你不喜欢编写原始的C代码,现在可以使用Rust(甚至Zig)编写PHP扩展。这使你可以将应用程序中繁重、性能敏感的部分卸载到安全、内存高效的编译代码中。特别是Rust,它在不牺牲速度的情况下提供了内存安全保证,这使其成为需要既可靠又快速的扩展的理想选择。

3. 基于Go的扩展与FrankenPHP

我们最近转向了FrankenPHP(在看到它被PHP基金会正式支持后)。在FrankenPHP的工作模式下运行PHP非常快——在我们的基准测试中,有时比传统设置快4倍以上

更令人兴奋的是,最近的一个版本引入了使用Go编写PHP扩展的功能。我们正在积极探索这一功能,因为它可以让我们在Go中构建高性能API,并在PHP单体中无缝暴露它们。这样,我们可以将PHP的生产力与Go的原始速度结合起来,而无需将所有内容拆分为单独的服务。

为什么不直接用Go或Rust重写一切?

这是一个合理的问题——我们也曾问过自己。主要有两个原因:

  1. 重写成本高。 许多应用程序已经庞大且稳定。重写是高风险、耗时的,并且通常会引入比解决的问题更多的问题。在大多数情况下,重写应该是最后的选择。

  2. PHP仍然是一个很好的选择。 对于大多数应用程序,PHP表现良好。它足够快、对开发者友好,并且拥有庞大的生态系统支持。对于那些真正需要最大性能的少数情况,你现在可以选择性地用Go或Rust编写部分扩展,而不是重写整个系统。

简而言之,现代PHP生态系统为我们提供了两全其美的方案:在PHP中快速且自信地构建,同时仍然拥有强大的选项(C、Rust、Go)来处理性能关键的部分。这种混合方法使我们在保持生产力的同时,在最需要的地方不牺牲速度。

评论总结

评论内容总结:

  1. PHP的优缺点

    • 优点:PHP在现代生态系统中提供了快速开发和性能优化的混合方案,适合大型代码库(评论4)。
      • 引用:“现代PHP生态系统给了我们两全其美的方案:快速开发的同时,还能在性能关键部分使用C、Rust、Go等语言。”(评论4)
    • 缺点:PHP在类型系统、FFI支持和每次请求的启动开销方面存在不足(评论4、6、7)。
      • 引用:“PHP仍然不支持类型化数组,例如它会接受字符串作为日期数组。”(评论4)
  2. 重写与混合方案的争议

    • 支持重写:部分评论者认为,从PHP重写到Go等语言可以显著减少代码量并提高效率(评论2)。
      • 引用:“我将应用从PHP重写到Go,代码从2万行减少到4千行,效率也大幅提升。”(评论2)
    • 反对混合方案:混合PHP与其他语言可能导致代码库难以维护(评论2、17)。
      • 引用:“混合Rust/PHP或Go会导致代码库难以维护。”(评论2)
  3. PHP的替代方案

    • 其他语言:C#等语言在开发速度和执行效率上表现优异,可能比PHP更适合某些场景(评论4)。
      • 引用:“C# API在开发速度和执行效率上都表现优异,很少需要用到C++或Rust。”(评论4)
    • 新兴技术:如Pasir、RoadRunner等新兴技术为PHP提供了新的可能性,但仍处于早期阶段(评论8、10)。
      • 引用:“Pasir类似于FrankenPHP,但用Rust实现,非常有前景。”(评论8)
  4. PHP的历史与现状

    • PHP的进步:PHP在近年来的版本更新中有了显著改进,部分评论者认为迁移离开PHP可能是一个倒退(评论14)。
      • 引用:“PHP现在已经很棒了,迁移离开PHP可能是一个倒退。”(评论14)
    • PHP的负面印象:部分评论者仍然对PHP持负面看法,认为其不适合现代开发(评论18)。
      • 引用:“我们还在假装PHP是几乎所有问题的解决方案,这简直是个笑话。”(评论18)
  5. 框架与库的选择

    • 反对全功能框架:部分评论者认为全功能框架(如Laravel)在升级和维护方面存在挑战,建议使用更灵活的库组合(评论15)。
      • 引用:“全功能框架在升级时总是遇到问题,因为每个项目都有独特的业务环境和基础设施需求。”(评论15)
    • 支持灵活组合:使用库组合构建服务可以提供更大的灵活性和控制力(评论15)。
      • 引用:“使用库组合构建服务需要更多时间,但可以逐步升级和调整。”(评论15)

总结:评论者对PHP的看法存在分歧,部分人认可其快速开发和混合方案的优势,但也有人批评其类型系统、FFI支持和维护复杂性。重写与混合方案的争议较大,新兴技术为PHP提供了新的可能性,但尚未成熟。此外,全功能框架的维护问题也引发了讨论。