Recent Entries
Archives
Search


Links
Powered by
Movable Type 2.64

2005年09月07日

PHPのCGI版の動作

PHPのCGI版の動作について:

例:
#!/usr/local/bin/php-cgi
<?php

?>

等あった場合に、どのようにしてphp-cgi版バイナリにスクリプトの位置が渡されているかというと、(apacheからもらう)CGI環境変数である SCRIPT_FILENAME を使っているわけです。この場合SCRIPT_FILENAMEは 上記の scriptそのものをさしています。つまり、apache側からみると CGIとして記述された shell scriptの位置なのですが、 php-cgi版から見ると phpの コードの位置となります。

ここで、このコードの中で system関数を使用して 外部の何かを呼び出した場合、 SCRIPT_FILENAME という環境変数はそのまま引き継がれます。したがって、このスクリプト内で system関数を使用して php-cgiを起動するような処理を書いてしまうと… php-cgiは SCRIPT_FILENAMEを見てしまうために、再びこのスクリプト自身が実行されることになります。

この動作については phpの処理系のコードで sapi/cgi/cgi_main.c 以下の init_request_info関数の処理を追う必要があります。 SCRIPT_FILENAMEがない場合は 引数として指定したスクリプトを実行させることも出来ますが、利便性から考えると これは逆の実装の方が良いんじゃないかとか思うわけです。 つまり、引数が指定されていたら 引数のスクリプトを優先して処理等。

しかし:
/* script_path_translated being set is a good indication that we are running in a cgi environment, since it is always null otherwise. otherwise, the filename of the script will be retreived later via argc/argv */

とか書いてますけどね。sapi/cgi/cgi_main.c#693

参考:
[PHP-users 26782] 外部PHPスクリプト実行でループ

Posted by minemaz at 2005年09月07日 11:33
トラックバック
このエントリーのトラックバックURL:
http://www.lancard.com/mt/mt-tb.cgi/276

Comments
Post a comment









Remember personal info?