带有 PHP 的 NodeJS

Vig*_*.V. 8 php node.js

我是一名刚开始学习 Node.js 的 PHP 开发人员,我看到了这个视频:https : //www.youtube.com/watch?v= _D2w0voFlEk, 其中解释说可以将 html 文件作为对浏览器的响应很好。

现在,我的问题:

如果我在同一台服务器上运行 Node.js 和 PHP,并且用户访问我的网站,则请求会转到在我的服务器中运行的 nodejs 脚本。现在,我可以在 NodeJS 中处理请求,然后给出一个 PHP 文件作为响应(在服务器端处理后)而不是 .html 文件

我的意思的大纲是:

客户端请求->NodeJS服务器->NodeJS脚本->PHP服务器->PHP脚本->客户端响应

它就像堆叠 2 个服务器。

为什么我会想到这个..

我正在制作一个社交网络网站,我已经用 PHP 编写了大部分代码,现在我正在从事视频/音频会议、文本聊天等的实时通信。所以,我计划使用 WebRTC 和 Websockets并发现许多网站都说 NodeJS 是考虑实时通信的最佳方式。

但是,如果我必须这样做,我必须将所有代码从 PHP 更改为 NodeJS,这不是一个好的选择。所以,我想为什么不在 NodeJS 服务器中运行 PHP 服务器。

提前致谢

我确实顺便提到了这个问题: 将 nodejs 与 php 应用程序集成的建议 ,觉得我的情况有点不同。

JSO*_*SON 6

PHP 作为CGI开始了它的早期生活。HTTP 服务器将通过生成 PHP-CGI 来执行 PHP 脚本,类似于命令行应用程序,将所有必要的数据(例如 $_GET、$_POST 和 $_SERVER 变量作为环境变量传递到生成的 CGI 进程中)。CGI 执行模型具有很高的性能成本,因此后来的 PHP 实现使用嵌入式库(例如 Apache 的 HTTPD mod_php)直接在 HTTP 服务器进程中执行 PHP 脚本或使用FastCGI的 PHP-FCGI SAPI协议在 HTTP 服务器进程之外执行 PHP 脚本的,这最初是 Windows 上的 IIS 用户所需要的。PHP-FCGI 和后来更受欢迎的 PHP-FPM SAPI 现在都是高性能和高需求的生产 HTTP/PHP 服务的标准,并且都作为本地守护进程运行,通常通过 Unix 域套接字(或本地 TCP 套接字)处理 IPC 上的 FCGI 请求在窗户上)。换句话说,IIS、NGINX 和 Apache HTTPD(如果使用 mod_fcgi 而不是 mod_php)等生产 HTTP 服务通常会使用内置的 FCGI 模块/客户端执行 PHP 脚本,以将 FCGI 请求发送到 PHP-FCGI 或 PHP-FPM ,在与 Web 服务器不同的进程中执行 PHP 脚本。如果您使用 FCGI 模块,例如 Node.JS,这也是可能的节点-phpfpm它允许节点以与其他现代高性能 HTTP 服务相同的方式在 PHP 上发出 FCGI 请求。这种方法允许节点在生产 HTTP/PHP 堆栈中按预期执行 PHP 脚本,这意味着它不需要使用特殊的守护进程或辅助服务(标准 PHP-FCGI 或 PHP-FPM 进程除外),不需要执行PHP 在与 HTTP 服务器相同的进程空间中,它不依赖于执行长时间运行的 PHP 脚本来访问分布式队列或其他消息传递接口上的请求。简而言之,它在 NGINX 或其他“标准”HTTP/PHP 服务的确切级别上将 Node.JS 与 PHP 耦合在一起,而无需使用变通方法或自定义协议/接口。

另一种选择,例如,如果您正在寻找更有状态的 PHP 解决方案,而不是仅仅创建页面,则是在 Node.JS 和守护进程的长时间运行的 PHP 脚本(例如 ZMQ、Redis、AMQ 等)之间使用队列或其他消息传递平台)

最后,您始终可以通过 HTTP 以某种方式从 Node.JS 向启用了标准 PHP 的 HTTP 服务器发出请求,如 Jose Mato 在他的回答中建议的那样。这个选项不像其他选项那样将 Node.JS 和 PHP 绑定在一起,需要额外的资源和网络上第二个 HTTP 服务器的开销,并且需要自定义协议,但对某些人来说可能更容易,因为这是如何JavaScript 已经与 PHP 交互了十多年。