2

だから私は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 モードで実行されていると見なすと、ページとすべてが生成され、うまく機能します。

私が知る必要があるのは:

  1. 私のスクリプトを見つけるためにphp-cgiのCGI環境変数を設定する正しい方法は何ですか.
  2. 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 のいくつかの組み合わせが機能するはずです。

4

1 に答える 1