2011-04-11 25 views
4

首先,我是法国学生,所以请原谅我的英语水平差 。php翻译和超全域舞

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

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

$在/ usr/bin中/ PHP的index.php

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

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

示例:如何设置这个$ _POST变量来保存我们的缓冲区中的“Hello world” ?

<?php 

echo $_POST['text']; 

?> 

谢谢您的未来回应。

亲切

+1

“请原谅我的英语水平差” - 至少你会说一些英语;) – ThiefMaster 2011-04-11 11:59:13

+0

Bonjour,回复是在这里http://stackoverflow.com/questions/942976 – Skrol29 2011-04-11 12:02:10

+0

可能的重复[如何通过GET和POST数据到php可执行文件?](http://stackoverflow.com/questions/942976/how-to-pass-get-and-post-data-to-the-php-executable) – Maerlyn 2011-04-11 12:14:57

回答

4

CGI程序期望在stdin POST数据。并在QUERY_STRING环境变量中获取数据。

3

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

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

你得到正确的价值观为HTTP头的这些变量。

您还需要一个双向管道以将PHP原始数据发送到它的STDIN。我假设你已经从PHP接收脚本输出。

只要你处理一个正常的浏览器请求,你不需要知道更多的细节。否则,如果POST数据从你的服务器来直接使用上面的CONTENT_TYPE和URL编码的变量:

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

STDIN数据: test=Hello+world

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

+0

非常感谢您的回复。 我试着尊重你的意见,但... POST请求不是为我工作:( 我用2进制第一个加载环境变量:http://pastebin.com/XbaaxRWF 另外一个呼叫PHP解释:http://pastebin.com/XYLv1yjV 这2进制之间,我们有一个管道的目的是tranfert所有信息 你有一个想法 GET方法的工作原理,所以拜?你= D 祝你有美好的一天 – user702041 2011-04-13 11:05:34

+0

我没有时间看看你的源代码,但不是运行PHP尝试启动一个shell脚本(或类似的),写将环境变量和STDIN数据转换为文本文件并检查数据。你也可以单独运行'set'和'cat',并且应该在STDOUT上获取信息。这样你就可以确定它不是因为其中一个安全限制而拒绝工作。 – 2011-04-15 10:03:46