0

我正在尝试编写一个网络服务器。我不想为 php 编写模块,所以我想我会像 nginx 和 apache 一样将信息传递给 php-fpm。我做了一些研究,并设置了原型,但无法让它工作。

我已经在端口 9999 上设置了一个 php 服务,它将在每次连接时打印_r($GLOBALS)。我已经设置 nginx 将 php 请求传递给 127.0.0.1:9999。请求正在传递,但只有 argc (1) 和 argv(php 服务的路径)和 $_SERVER 变量被填充。$_SERVER 变量有很多关于 php 进程正在运行的当前环境的信息,但我没有看到任何关于连接用户或他们的请求的信息 - 没有 REMOTE_ADDR,没有 QUERY_STRING,什么都没有......

我无法找到有关如何将这些信息从 cli 或原型服务器传递到 fastcgi php 进程的文档。我找到了一些旧 CGI 变量的列表,但没有关于如何传递它们的信息,或者它们中的任何一个是否已经过时使用 fastcgi。

所以,我再次问你如何将信息从你的服务器原型或 cli 传递到 php-fpm 或 fastcgi 进程——或者,我在哪里可以找到关于这个主题的正确、清晰和明确的文档?(不,RFC 不是答案)。我已经阅读了 fastcgi.com 和维基百科以及许多其他搜索结果......

=== 更新 ===

我已经设法通过 php 中的原型启动并运行一个有效的 fastcgi“服务”。它监听 9999,解析来自 cli 甚至来自 nginx 的二进制 fcgi 请求,它格式化二进制 fcgi 响应,通过网络将其发送回,cli 显示它很好,nginx 甚至将解码的 fcgi 响应返回给浏览器就像大自然的意图。

现在,当我尝试以另一种方式做事时——编写我的原型服务器,它形成一个二进制 fcgi 数据包并将其发送到 PHP-FPM,我什么也没得到——在 cli 或错误日志中没有错误输出(我可以永远不要让 php-fpm 以任何方式写入错误日志 [-_-])。那么,为什么 php-fpm 不给我某种响应,无论是错误文本,还是二进制网络数据包,或任何东西???

所以,我可以将数据从 cli 发送到 fastcgi,但我无法取回任何东西,除非它是我自己的 fastcgi 进程(不,我没有接管 php-fpm 的端口 - 我在 9999 上,它是9000)。

==============

TIA \m/(>_<)\m/

4

1 回答 1

0

知道了。

服务器以网络数据包的形式将信息传递给fastcgi进程。很像 dns 数据包,您必须使用您的语言相应的二进制字符操作函数来制定数据包,包括它的标头和有效负载信息,然后通过管道/网络将其发送到 fastcgi 服务器,然后它将解析二进制数据包成回应。有趣的东西 - 可以有更好的记录,咳咳:-\

哦,如果你在 php 中创建一个监听器原型,你不能通过任何 php vars 访问这个数据包,你实际上必须读取你正在监听的连接(因为它是一个二进制网络数据包而不是纯文本“发布”数据发送)。

我已经设法通过 php 中的原型启动并运行一个有效的 fastcgi“服务”。它监听 9999,解析来自 cli 甚至来自 nginx 的二进制 fcgi 请求,它格式化二进制 fcgi 响应,通过网络将其发送回,cli 显示它很好,nginx 甚至将解码的 fcgi 响应返回给浏览器就像大自然的意图。

于 2012-09-07T20:56:33.563 回答