2012-07-16 61 views
2

因此我正在編寫一個web服務器(我知道,就像世界需要另一個!)我想通過CGI調用php。例如,我有一個很好的工作CGI1.1實現,足以運行perl cgi腳本。如何從C++調用php-cgi

現在我想運行php。但是當我的CGI模塊調用PHP程序時,它將返回一個404.

如何獲得此工作?

詳細信息:

我使用php5在ubuntu上運行。在我的web服務器中,我將cgi請求傳遞給一個處理程序,該處理程序將查找該程序並將其作爲參數與sc ript進行調用。因此,這裏是派生的CGI程序的代碼:

chdir(dir); 
execve(argv[0], argv.data(), (char* const*) req.posixEnv()); 

我跑的命令等同於:

/usr/bin/php5-cgi /home/rafael/webserver/data/cgi-bin/test.php 

這意味着我已經設置「目錄」來:

/home/rafael/webserver/data/cgi-bin 

cgi進程應該在該目錄下運行。的argv [0]是 「的/ usr /斌/ PHP5-CGI」,argv.data()返回一個空終止陣列包含下列元素:

/usr/bin/php5-cgi 
/home/rafael/webserver/data/cgi-bin/test.php 
NULL 

過程環境包含包括的塊的CGI環境通常的CGI環境變量。

當我從shell運行上述命令時,即通過從字面上將其輸入到shell中,腳本運行良好,php生成測試頁。當我從CGI調用它時,它返回:

Status: 404 Not Found 
X-Powered-By: PHP/5.3.10-1ubuntu3.2 
Content-type: text/html 

No input file specified. 

現在我知道或多或少發生了什麼。 PHP正在檢測它是以CLI還是CGI模式運行,並且搜索腳本以在每種模式下以不同的方式運行。在CGI模式下,它可能使用像SCRIPT_FILENAME和DOCUMENT_ROOT這樣的CGI環境變量來解析腳本名稱。我試了一大堆東西 - 這些變量的不同設置。但沒有一個可行。

我知道的是:PHP的整個產卵,並閱讀輸出的作品。例如,如果我刪除了某些CGI變量,以至於它認爲它在CLI模式下運行,那麼它很好用 - 生成頁面和所有內容。

我需要知道的是:

  1. 什麼是設置爲PHP-CGI的CGI環境變量來找到我的腳本以正確的方式。
  2. 什麼是從exec調用php腳本的正確方法。我正在使用完整路徑來解決這個問題。我寧願使用相對路徑。

我能找到的所有文檔都是關於在特定Web服務器上爲cgi配置php。我需要從編寫服務器的人的角度來了解這一點。

@EDIT:我有一個簡單的例子,消除c + +。無論如何,我很確定這部分工作正常。假設我製作了一個調用php-cgi的腳本,並且嘗試在shell中模擬cgi調用約定。

這工作:

#export GATEWAY_INTERFACE="CGI/1.1"                        
export REDIRECT_STATUS=200 
export SERVER_PROTOCOL="HTTP/1.1" 
export DOCUMENT_ROOT="/home/rafael/web" 
#export SCRIPT_FILENAME="cgi-bin/test.php"                      
export SCRIPT_NAME="cgi-bin/test.php" 

/usr/bin/php5-cgi test.php 

但這並不:

export GATEWAY_INTERFACE="CGI/1.1"                        
export REDIRECT_STATUS=200 
export SERVER_PROTOCOL="HTTP/1.1" 
export DOCUMENT_ROOT="/home/rafael/web" 
#export SCRIPT_FILENAME="cgi-bin/test.php"                      
export SCRIPT_NAME="cgi-bin/test.php" 

/usr/bin/php5-cgi test.php 

我想大概DOCUMENT_ROOT,SCRIPT_FILENAME和SCRIPT_NAME的組合應該工作。

回答

0

搞亂它的事情是在php.ini中設置「doc_root」。我不喜歡這樣的:

doc_root = 

現在CGI環境變量的工作更像CGI規範說的。例如。下面的東西現在有效:

export GATEWAY_INTERFACE="CGI/1.1" 
export SERVER_PROTOCOL="HTTP/1.1" 
export SCRIPT_FILENAME="/home/rafael/web/cgi-bin/test.php" 
export SCRIPT_NAME="test.php" 
export REDIRECT_STATUS="200" 

/usr/bin/php5-cgi test.php