4

首先,我是一名法国学生,请原谅我的英语水平不佳。

我们目前正在开发一个 Web 服务器 (C++),我必须开发 CGI 执行部分,更准确地说:PHP CGI 部分。

当用户询问我们服务器上的 .php 页面时,我们 fork/pipe 并调用 /usr/bin/php 解释器。例如 :

$ /usr/bin/php 索引.php

现在,我们可以将结果保存在缓冲区中(生成的 index.php 的 html 代码),我可以将此内容发送给客户端。它适用于没有任何变量的简单脚本。

然而,许多 php 脚本使用一些超全局变量,如 $_GET 和 $_POST。我的问题是:我怎样才能给 php 解释器这个论点?

示例:如何设置此 $_POST 变量以将“Hello world”保存在我们的缓冲区中?

<?php

echo $_POST['text'];

?>

感谢您未来的回复。

亲切地

4

2 回答 2

4

CGI 程序需要 POST 数据stdin。并获取QUERY_STRING环境变量中的数据。

于 2011-04-11T12:00:19.323 回答
3

您必须设置一些环境变量:

  • REQUEST_METHOD=POST告诉 PHP 它需要处理一个 POST 请求
  • CONTENT_LENGTH=1234告诉 PHP 它将接收多少字节作为原始 POST 数据(在本例中为 1234 字节)
  • HTTP_CONTENT_LENGTH基本相同CONTENT_LENGTH。最好也设置它,以便它可以更好地与各种 PHP 版本/配置一起使用。
  • CONTENT_TYPE=application/x-www-form-urlencoded是 HTTP Content-Type 标头

您可以从 HTTP 标头中获得这些变量的正确值。

您还需要到 PHP 进程的双向管道将原始 POST 数据发送到它的 STDIN。我假设您已经收到了来自 PHP 的脚本输出。

只要你处理一个普通的浏览器请求,你就不需要知道更多的细节。否则,如果 POST 数据直接来自您的服务器,请使用上面的 CONTENT_TYPE 并对变量进行 url 编码:

  • REQUEST_METHOD=POST
  • CONTENT_LENGTH=16
  • HTTP_CONTENT_LENGTH=16
  • CONTENT_TYPE=application/x-www-form-urlencoded

标准输入数据: test=Hello+world

对于 GET 请求,您更改REQUEST_METHOD=GET并保留其他变量。无论哪种情况,您都可以通过QUERY_STRING环境变量传递查询字符串。

于 2011-04-11T12:10:55.227 回答