转到网络应用程序 : How to route PHP scripts to PHP-FPM from Golang

标签 go

我有一个主要网站和许多小网站。我目前正在为所有这些使用 Nginx 和 PHP。我的计划是取消两者,并在 Go 中构建一个单一的 Web 应用程序来服务所有内容,这有望减少负载和内存(特别是因为某些页面的计算量非常大。)

我的问题是,尝试将很少使用的 PHPBB 论坛之类的东西移植到 Go 上对我来说会是一种严重的时间浪费。所以我希望主网站全部由 Go 网络应用程序提供服务,但其他一些网站可以保留为 PHP。

我的问题是:我可以使用 Go 网络应用将 PHP 脚本请求路由到 PHP-FPM 吗?

我希望这样我就可以摆脱 Nginx,网络应用程序将处理所有传入流量并直接从其自己的代码为主站点提供服务,但对于仍在 PHP 中的不太重要的站点,这些可以是由 Go 应用程序提供服务,将这些请求路由到 PHP-FPM(连同所有完整的请求信息,包括 cookie、POST 变量等)

有什么想法吗?

最佳答案

我意识到这是一篇古老的帖子,但这是我的答案,因为在遇到基本相同的问题后我不得不自己研究这个问题。

TL;DR 我建议通过 HTTP 代理到 Nginx 并让它与 PHP-FPM 对话 - 不是因为 Nginx 更好或更快或更 Shiny 或其他什么,而是因为这个代码路径经过了更好的测试和数量级维护并且缺点很小。

两种明显的方法:

A) 通过转到 PHP 使用 Nginx 和代理请求。这可以按照 @fabrizioM 的回答中所述使用 httputil 完成,并且本质上是通过 HTTP 将请求代理到 Nginx,然后将其转换为 FastCGI 并调用 PHP-FPM。

B) 使用 FastCGI 协议(protocol)的实现直接从 Go 调用 PHP-FPM。我还没有尝试过这个,但是有很多 Go 库声称可以这样做,包括:

注意我意识到其中一些可能在提出问题时不存在。

在撰写本文时,上面的第一个有 21 颗星。

IMO,虽然 Nginx 是一个很棒的网络服务器,但与在 Go 中提供静态文件相比,它并没有什么好处。但是,在这里使用 Nginx 有一个好处,那就是 FastCGI 代码的稳定性和维护性。显然在 Go 中通过 FastCGI 调用并不是一种非常流行的方法,我不知道我对这个实现有多信任。另一方面,有无数的 PHP 开发人员信赖 Nginx+PHP-FPM,并且它经过了良好的测试和维护。

使用 HTTP 进行代理时还有一些其他好处,例如当您在本地开发期间通过 Internet 将来自您的 Go 进程的请求转发到您的 PHP 服务器所在的任何地方时,它更有可能正常工作。这使得破解您的 Go 应用程序变得容易,而无需运行所有 PHP 内容的本地副本,但仍然能够看到所有功能。

因此,虽然这两种方法都是可行的,但我的建议是仅包括 Nginx,因为它是您的请求流经的更好受支持的代码路径,具有一些实用的本地开发优势,并且性能损失可以忽略不计。我认为这些论据比“Nginx 擅长提供静态文件”或“内存使用率低”等论据更有力。

关于转到网络应用程序 : How to route PHP scripts to PHP-FPM from Golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24587731/

相关文章:

go - 什么是 `regex grep` ,应用于文件,Golang 中的等价物?

go - 调用后获取操作系统错误的惯用方法

go - 在Firestore中找不到docRef.Get(ctx)的读取成本是多少?

function - 了解 Golang 中的接口(interface)

reflection - 反射(reflect): How to get the name of a struct field?

gosnmp 从 SNMP PDU 中获取八位字节串

go - 为什么要比较在 golang 中使用按位与?

go - time.Duration 类型微秒值到毫秒的转换

Golang官方驱动中的MongoDB连接池

c++ - 如何获取当前DLL的目录