php 微信公众平台开发教程如何结合和PHP这两种语言解决实际开发中的问题方倍工作室微信公众平台开发最佳实践^^^微信公众平台开发最佳
2022-11-09
在过去的十年中,我的团队为财富 500 强公司或只有 500 名用户的公司开发了软件。在此期间,我的工程团队主要使用 PHP 进行后端开发。2 年前,我们在我们的开发项目中引入了一些东西,它不仅彻底改变了我们产品的性能,还改变了它们的可扩展性——我们将把它引入我们的开发框架。
很快,我们找到的参考资料使我们能够为客户设计更大、速度提高 40 倍的应用程序。我们可以利用 Go 的强大功能来增强我们用 PHP 编写的产品php 微信公众平台开发教程,并利用这两种语言的优缺点。
我将解释如何将这两种语言与 PHP 结合来解决现实世界的开发问题,这将为您提供一条全新的 PHP 开发路径,以解决与垂死的 PHP 模型相关的一些问题。
先介绍常用的PHP设置
在回答我们如何使用它使 PHP 起死回生之前,让我们回顾一下标准的 PHP 设置。
在大多数情况下,PHP 开发人员将结合使用 web- 和 php-fpm 服务器来运行应用程序。当 php-fpm 执行 PHP 代码时,它提供静态文件并将特定请求转发给 php-fpm。也可以与 . 尽管这与上面的工作方式略有不同,但原理是相似的。
开发人员最感兴趣的是了解 php-fpm 如何执行应用程序的代码。发送请求时,php-fpm 启动 PHP 子进程并将请求内容作为进程状态的一部分(_GET 等)。在 PHP 脚本的执行过程中,状态是无法改变的,所以获取一组新的输入数据的唯一方法就是销毁进程并重新开始。
像这样的执行模型有很多好处。您不必担心内存使用情况,所有进程都是完全隔离的,如果其中任何一个死了,那么它们将自动创建而不会影响其他进程。但与此同时,当您尝试扩展应用程序时,此功能可能会成为程序开发的绊脚石。
一般的PHP设置很麻烦,使用效率很低
如果你今天在做专业的 PHP 开发,你应该已经知道开始一个新项目的第一步——选择一个框架。该框架提供依赖注入、ORM、翻译和大量丰富的库。当然,所有用户输入数据都可以方便地放置在一个对象(/或 PSR-7)中。该框架使用起来非常方便!
但一切都有两个方面。所有企业级框架都要求您加载至少十几个文件、构造多个类并解析一些配置,以便处理简单的用户请求或查询数据库。最糟糕的是,您必须在完成每个任务后丢弃代码。你刚开始的所有代码现在都没有用了,永远不能用来处理另一个请求。告诉任何不使用 PHP 的开发人员网站优化,他们会感到困惑和无法理解。
多年来,聪明的 PHP 工程师一直试图通过使用延迟加载、微框架、优化库、二级缓存等技术来缓解这些问题。但是在你的项目结束时,你仍然必须扔掉你的整个过程,一遍又一遍地重新开始。
PHP 可以在 的帮助下支持多个请求吗?
可以编写生命周期超过几分钟的 PHP 脚本,只要它们不是几小时或几天:诸如 cron 作业、CSV 解析器和队列消费者之类的东西。所有这些脚本都遵循相同的过程:检索值、执行作业并等待下一个值到达。代码一直保存在内存中,由于加载框架和引导程序所需的交互量,最终只节省了几毫秒。
开发长时间运行的脚本并不容易。任何错误都会彻底终止进程,诊断内存泄漏很麻烦,我们不能再使用 f5- 了。
然而,随着 PHP7 的引入,情况有所改善,它提供了一个可靠的垃圾收集器,使错误更容易处理并防止核心内存泄漏。虽然工程师仍然必须小心他们代码中的内存和状态问题,但您不必担心无法找出问题所在并有效地修复它们。
是否有可能采用一个需要长时间运行 PHP 脚本的模型,并使其适应更复杂的任务,例如处理 HTTP 请求和消除每个请求的引导加载?
首先,我们需要实现一个服务器程序,接受 HTTP 请求,并将它们一个一个地转发给 PHP 工作人员,而不是每次都杀死工作人员。
我们知道我们可以用纯 PHP(PHP-PM)实现一个 Web 服务器,或者用 C-() 编写它。虽然这两种方法各有优势,但都不能满足我们,我们需要更好的方法。
我们需要的不仅仅是一个 Web 服务器,我们还希望能够消除 PHP 开发的繁重工作和其他负面影响,同时仍然保持每个应用程序的可伸缩性和多样性。我们需要一个可以多样化的应用服务器。
您能帮我们创建这样一个应用服务器吗?我的回答是,可以。由于该语言是跨平台的,它可以将应用程序编译成单个二进制文件,我们还可以利用其非常优雅的并发模型和 HTTP 标准库,最重要的是,我们可以使用我们拥有的数千个开源库库和集成环境。
如何让两种编程语言进行集成开发
首先,我们需要了解两个或多个应用程序如何相互通信(进程间通信)。
一种方法是使用 Alex 在英国发布的令人生畏的库,它可以在 PHP 和进程之间共享内存(类似于)。但是,这种库在我们的实际开发中给我们带来了很大的限制。
我们决定使用另一种更经典的方法,即在 / 上使用二进制流来完成进程间通信。我们之所以选择这种方式,是因为这种通信方式已经使用了几十年,是一种可靠的通信方式,并且在操作系统层面进行了很好的优化。
首先,我们创建了一个轻量级的二进制协议,用于在进程之间交换数据和处理错误。在最简单的实现中,这种类型的协议是类似的实现,具有固定大小的标头(单击此处查看我们的示例),其中包含有关每个数据包的类型、大小和二进制掩码的信息,以验证数据完整性。
在 PHP 方面,我们使用包 PHP 函数。因为,我们使用了 / 库。
我们甚至在创建协议方面更进了一步。添加了直接从 PHP 调用 net/rpc 服务的能力。此功能在开发中非常有用,因为我们可以轻松地将库集成到我们的 PHP 应用程序中。您可以在我们发布的另一个名为 .
实现PHP高并发处理任务
一旦建立了通信,下一个目标就是最有效地将作业交付给 PHP 进程。对于任何传入的作业,应用程序服务器必须选择一个空闲的工作人员来执行所需的任务。如果 / 失败或死亡,我们将其丢弃并为其创建替换过程。另一方面网站优化,如果 / 成功,我们将其返回到池中并使其可用于下一个作业。
在这个需求的实现中,我们使用一个缓冲通道来存储一个活跃的工人池。
最终结果是一个能够处理任意二进制作业的有效 PHP 服务器。
为了让我们的应用程序作为 Web 服务器工作,我们必须选择一个可靠的 PHP 标准来表示任何传入的 HTTP 请求。为了满足这个需求,我们简单地将 net/HTTP 请求转换为 PSR-7() 格式,使其与市场上的大多数 PHP 框架兼容。
由于 PSR-7 格式是不可变的(一些工程师可能会指出它在技术上是不可变的),它迫使开发人员编写不再将请求视为全局实体的应用程序。这完全符合长期运行 PHP 进程的想法。最终实现如下所示:
简介 - 一个高性能的 PHP 应用服务器
我们最初的测试用例是一个用于后端的 API,其不可预测的请求突发量比平时高出许多倍。虽然它在大多数情况下会有所帮助,但经常会出现 502 错误,因为我们无法预测负载何时会增加,也无法在负载增加之前快速平衡系统。
2018 年初,我们在市场上部署了我们的第一台 PHP/应用程序服务器以替换此设置。效果立竿见影,令人难以置信。我们不仅完全消除了 502 错误,而且最终将服务器总数减少了近三分之二,从而为工程师和产品所有者节省了大量工作和服务器成本。
到 2018 年年中,我们优化了该方法,在 MIT 许可下发布,并调用它,实现了令人难以置信的速度和效率。
如何帮助发展
引入我们的技术堆栈将允许我们使用中间件进行 HTTP 通信php 微信公众平台开发教程,在请求到达 PHP 之前启用 JWT 验证,处理并将统计信息汇总到其中。通过使用嵌入式 RPC,我们可以将 API 从任何库传递到 PHP 以供使用,而无需自定义驱动程序。最重要的是,我们可以使用该库来设置一个不同于 HTTP 的新服务器。示例包括在 PHP 中运行 AWS 处理程序,创建可靠的队列使用,甚至将 GRPC 添加到我们的应用程序。
到目前为止,在 PHP 和开发社区的帮助下,我们改进了调试工具,将它们与框架集成,并添加了对 HTTP/2 和 PSR-17 的处理。我们提高了程序的稳定性,在一些测试中,程序的性能提升了多达 40 倍。
综上所述
有些人仍然坚持认为 PHP 是一种缓慢而笨拙的语言,只能用于编写插件。他们甚至可能会说 PHP 有一个限制:一旦你的应用程序变得更大,你必须切换到更“成熟”的语言并替换以前的 PHP 代码。
对他们来说,我们想说“请三思而后行”。我们认为 PHP 的唯一限制是您给自己的限制。您可以花一生的时间从一种语言跳到另一种语言,试图找到适合您的编程需求的“完美匹配”,或者您可以开始将语言本身重新想象成一种工具。像 PHP 这样的编程语言明显的缺点实际上可能是其成功的关键。通过将其与 Go 等其他语言配对,您最终可以创建比自己使用任何一种语言更强大的产品。
在用 Go 和 PHP 进行了一段时间的混合编程之后,我们可以自信地说我们都喜欢这种开发方式。我们不会放弃,我们将继续寻找充分利用这种双栈编程的方法。
腾云网络是一家领先的软件开发商,为旧金山和美国各地的客户提供从小型网站到大型分布式系统的定制产品的全栈开发。如果您有 PHP 或相关项目,或者遇到无法在 PHP 中扩展或受过时代码压缩限制的应用程序,请与我们的团队联系。
: , 首席技术官,
通过:
作者:John W. 译者:校对:
本文由GCTT原创编译,Go语言中文网首发。