だから私はWebサーバーを書いています(私は知っています、世界が別のサーバーを必要としているように!) そして、CGIを介してphpを呼び出したいです。たとえば、perl cgi スクリプトを実行するのに十分な、うまく動作する CGI1.1 実装があります。
今私はphpを実行したいと思います。しかし、私の cgi モジュールが php プログラムを呼び出すと、404 が返されます。
これを機能させるにはどうすればよいですか?
詳細:
私はphp5でubuntuを実行しています。私の Web サーバーでは、cgi 要求をハンドラーに渡します。ハンドラーはプログラムを見つけ、スクリプトを引数として呼び出します。cgi プロセスを生成するコードは次のとおりです。
chdir( dir );
execve( argv[0], argv.data(), (char* const*) req.posixEnv() );
私が実行しているコマンドは次と同等です:
/usr/bin/php5-cgi /home/rafael/webserver/data/cgi-bin/test.php
これは、「dir」を次のように設定したことを意味します。
/home/rafael/webserver/data/cgi-bin
cgi プロセスはそのディレクトリで実行する必要があります。Argv[0] が「/usr/bin/php5-cgi」の場合、argv.data() は次の要素を含む null で終了する配列を返します。
/usr/bin/php5-cgi
/home/rafael/webserver/data/cgi-bin/test.php
NULL
プロセス環境には、通常の CGI 環境変数のブロックを含む CGI 環境が含まれています。
上記のコマンドをシェルから実行すると、つまり文字通りシェルに入力すると、スクリプトが正常に実行され、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 を呼び出すスクリプトを作成し、シェルで 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 のいくつかの組み合わせが機能するはずです。