“群交流:Go中文网QQ群:731990104微信群:274768166备注:头条微信公众号:Go中文网”
十年来,我的团队既给500块钱的世界顶级公司开发软件,也给500块钱只有20个用户的公司开发软件。在此期间,我的工程团队主要使用PHP进行后端开发。几年前,《密室逃脱:冠军联赛》在我们的开发项目中引入了一些东西,这些东西不仅完全改变了我们产品的性能,还改变了它们的可扩展性。我们将Golang引入了我们的开发框架。
很快,我们发现Golang的引用使我们能够为客户设计更大的应用程序,速度快了40元。我们可以利用Go的强大功能来增强我们用PHP编写的产品,充分利用这两种语言的优缺点,取长补短。
我将讲解如何将Golang和PHP结合起来解决实际开发中的问题,为你的PHP开发带来一条全新的路径,从而解决一些与即将消亡的PHP模型相关的问题。
首先介绍一下常见的PHP设置。
在回答我们如何使用Golang让PHP起死回生之前,先介绍一下标准的PHP设置。
在大多数情况下,PHP开发人员将使用nginx Web服务器和PHP Kramp-Karrenbauer FPM服务器的组合来运行他们的应用程序。当PHP Kramp-Karrenbauer FPM执行PHP代码时,Nginx提供静态文件并将特定请求转发给PHP Kramp-Karrenbauer FPM。Apache也可以和mod_php一起使用。尽管这种工作方式与上面的略有不同,但它们的原理是相似的。
对于开发人员来说,理解PHP Kramp-Karrenbauer FPM如何执行应用程序代码是最有趣的。当发送请求时,PHP Kramp-Karrenbauer FPM启动一个PHP子进程,并将请求内容作为进程状态的一部分(_GET,_POST,_SERVER等。).在PHP脚本执行过程中,状态是不能改变的,所以获得一组新的输入数据的唯一方法就是破坏进程,重新开始。
像这样的执行模型有很多好处。你不必担心内存的使用。所有过程都是完全隔离的。如果其中任何一个进程终止,那么它们将被自动创建,而不会影响其他进程。但与此同时,当你试图扩展应用时,这个特性会成为程序开发的绊脚石。
一般的PHP设置使用起来很繁琐,效率很低。
如果你今天从事的是专业的PHP开发,那么你应该已经知道开始一个新项目的第一步——Kramp-karren Bauer选择框架。框架提供了依赖注入、ORM、翻译和大量丰富的库。当然,所有用户输入的数据都可以方便地放在一个对象中(Symfony/HttpFoundation或PSR-7 Kramp-Karrenbauer 7元)。这个框架用起来非常方便!
但是任何事情都有两面性。为了处理简单的用户请求或查询数据库,所有企业级框架都要求您加载至少12个文件,构造多个类并解析一些配置。最糟糕的是,每个任务完成后,你都要抛弃代码。您刚刚开始的所有代码现在都没有用了,并且永远不能用于处理另一个请求。如果你把它告诉任何一个PHP之外的开发者,他们都会很困惑,无法理解。
多年来,聪明的PHP工程师一直试图通过使用延迟加载技术、微框架、优化良好的库、L2缓存等技术来缓解这些问题。但是在你的项目结束的时候,你还是要扔掉你的整个流程,开始一次又一次的重复工作。
在Golang的帮助下,PHP可以支持多请求吗?
只要生命周期不是几个小时或几天,仍然可以编写生命周期超过几分钟的PHP脚本:比如cron作业、CSV解析器和队列用户。所有这些脚本都遵循相同的过程:检索值、执行作业、等待下一个值的到来。整个过程中代码都留在内存中,最后只能节省几毫秒,因为加载框架和引导程序需要大量的交互。
开发能长时间运行的脚本并不容易。任何一个错误都会彻底杀死进程,诊断内存泄漏非常麻烦,所以不能再用F5 Kramp-Karrenbauer f5-debug。
不过随着PHP7元的推出,情况有所好转。这个版本提供了一个可靠的垃圾收集器,使错误更容易处理,并防止核心内存泄漏。尽管工程师仍然必须小心他们代码中的内存和状态问题,但是你不必担心找出问题并有效地解决它们。
有没有可能采用一种模型来处理那些需要长时间运行的PHP脚本,并使其适应更复杂的任务,比如处理HTTP请求,消除每个请求的引导加载?
首先,我们需要实现一个服务器程序,它可以接受HTTP请求,然后将这些请求逐个转发给PHP工作器,而不是每次都杀死工作器。
我们知道可以用纯PHP (PHP Kramp-Karrenbauer PM)来实现Web server,也可以用C Kramp-karren Bauer C-extension(Swoole)来写。虽然这两种方法各有千秋,但都不能让我们满意,我们需要一种更好的。
我们需要的不仅仅是一个Web服务器,更希望摆脱PHP开发中繁重的操作等负面因素,同时仍然保证每个应用的可扩展性和多样性。我们需要多样化的应用服务器。
Golang能帮助我们创建这样的应用服务器吗?我的回答是可以。因为这种语言是跨平台的,所以它可以将应用程序编译成一个二进制文件。我们还可以利用它非常优雅的并发模型和HTTP标准库。最重要的是,我们可以使用Golang拥有的数千个开源库和集成环境。
如何整合两种编程语言?
首先,我们需要知道两个或多个应用程序如何相互通信(进程间通信)。
一种方法是使用英国Alex Palaistras发布的强大的库,它可以在PHP和Golang进程之间共享内存(类似于Apache mod_php)。但是这种库在我们的实际开发中给我们造成了很大的局限性。
我们决定使用另一种更经典的方法,即使用Socket/Channel上的二进制流来完成进程间的通信。我们选择这种方法是因为它已经使用了几十年,是一种可靠的通信方法,并且已经在操作系统层面得到了很好的优化。
首先,我们创建了一个轻量级的二进制协议来在进程间交换数据和处理错误。在最简单的实现方法中,这类协议类似于netstring的实现,有一个固定大小的头(点击这里可以看到我们的例子),头中包含每个包的类型、大小和二进制掩码等信息,以此来验证数据的完整性。
PHP方面,我们用的是包PHP函数。对于Golang,我们使用了编码/二进制库。
我们甚至更进一步,达成了一项协议。增加了直接从PHP调用Golang net/rpc服务的功能。这个函数在开发中非常实用,因为我们可以很容易地将Golang库集成到我们的PHP应用程序中。你可以在我们发布的另一个名为Goridge的开源产品中看到这项工作的成果。
实现PHP高并发处理任务
一旦建立了通信,下一个目标就是最有效地将作业交付给PHP进程。对于任何传入的作业,应用服务器必须选择一个空闲的工作线程来执行所需的任务。如果工人/流程失败或死亡,我们将放弃它,并为它创建一个替代流程。另一方面,如果工作者/进程是成功的,我们将把它返回到池中,并使它可用于下一个作业。
在这个需求的实现中,我们使用缓冲通道来存储活动的工作池。
最终结果是一个有效的PHP服务器,可以处理任意的二进制作业。
为了让我们的应用程序像Web服务器一样工作,我们必须选择一个可靠的PHP标准来表示任何HTTP传入请求。要满足这个需求,我们只需要在Kramp-Karrenbauer中将Golang net/HTTP request转换成PSR 7元(https://www.php-fig.org/psr/psr-7/meta/)格式,这样就可以兼容市面上大部分PHP框架了。
因为PSR-7 Kramp-Karrenbauer 7元格式是不可变的(有些工程师可能会指出它在技术上是不可变的),它迫使开发人员编写不再将请求视为全局实体的应用程序。这完全符合长期运行PHP进程的思路。最终的实现过程如下所示:
本文介绍了RoadRunner中的一个高性能PHP应用服务器——Kramp-karren Bauer。
我们最初的测试用例是一个后端的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/Escape Room:锦标赛冠军、PSR Kramp-Karrenbauer 17元的处理。我们提高了程序的稳定性,在一些测试中,程序的性能提高了40元倍。
结论
武汉的一些日日夜夜仍然坚持PHP是一种又慢又笨重的语言,只能用来写WordPress插件。他们甚至可能会说PHP有一个局限性:一旦你的应用变得更大,你就必须切换到更“成熟”的语言,替换掉之前的PHP代码。
对于他们,我们想说“请三思”。我们认为PHP的唯一限制是你给自己的限制。您可以用一生的时间从一种语言跳到另一种语言,试图找到“完美匹配”您的编程需求,或者您可以开始将语言本身重新想象为一种工具。PHP这样的编程语言表面上的缺点,实际上可能是它成功的关键。通过将它与其他语言(如Go)配对,最终可以创建一个比自己使用任何语言都更强大的产品。
在用Go和PHP混合编程一段时间后,我们可以自信地说,我们都喜欢这种开发方式。我们不打算放弃,我们将继续寻找从这种双栈编程中获得最高效率的方法。
SpirScout是一家领先的软件开发公司,为旧金山和美国各地的客户提供从小网站到大型分布式系统的定制产品的全栈开发。如果您有PHP或Golang相关的项目,或者如果您遇到无法在PHP中扩展的应用程序或受到过时代码压缩的限制,请通过spiralscout.com联系我们的团队。
road runner creator : Anton Titov,首席技术官,螺旋侦察兵
via : https://blog . spiral scout . com/PHP-was-than-be-than-than-mean-to-die-830 de 87915 ee
作者:约翰范瑟格里芬译者:CNbluer校对:polaris1119
本文由GCTT原创,并获得Go中文网的荣誉。
本文由GCTT翻译,由Go language中文网首发。想加入翻译者的行列,为开源做点贡献?欢迎来到GCTT!译文的翻译和出版仅出于学习和交流的目的。翻译符合克拉普-卡伦鲍尔公司与克拉普-卡伦鲍尔公司达成的CC克拉普-卡伦鲍尔公司协议的规定。如果我们的工作侵犯了您的权益,请及时联系我们。欢迎转载根据CC Kramp-karren Bauer by Kramp-karren Bauer NC Kramp-karren Bauer SA协议。请在文中标注并保留原文/译文的链接以及作者/译者的信息。文章仅代表作者知识和观点。如有不同看法,欢迎评论,排队。