2011-04-11 77 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