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スクリプト実行でループ