因此我正在編寫一個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模式下運行,那麼它很好用 - 生成頁面和所有內容。
我需要知道的是:
- 什麼是設置爲PHP-CGI的CGI環境變量來找到我的腳本以正確的方式。
- 什麼是從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的組合應該工作。