PHPのmain関数を読み解く
こんばんは、めのんです!
今夜の投稿はどんな話題にしようか決めかねていましたが、結局お昼の続きでPHPの話題にすることにしました。
お昼に続き、PHPのソースコードを読み解いています。 PHPのソースコードというのはPHPで書かれたソースコードではありません。 そうじゃなくて、Cで書かれたPHPの言語処理系のソースコードです。
お昼の時点で、CGI版とCLI版のmain関数にはたどり着くことができました。 それから次はどうしようかと考えた結果、CGI版ならWebサーバーから渡される環境変数をPHPのスーパーグローバルに格納する箇所が必ずあるはずと思いました。
確かにそれっぽいところは見つけました。 環境変数を最初に取得する際はgetenv関数を使っていますが、ハッシュテーブルを使って次回以降の引き当てを高速化しているんだろうなというのも何となく見えてきました。 でも、CGI版のmain関数は1000行ぐらいあって一筋縄ではいきません。
CLI版のmain関数ものぞいてみたところ、こっちはそんなに長くなくて多少は楽そうです。 それに、コマンドライン引数を解析して得られるオプションの処理を読み解くのはそんなに難しくなさそうです。
そういえば、なぜかCGI版にもコマンドライン引数の処理がありましたが、CGIでもそんなのを使うんですね。 知りませんでした。
で、CLI版ですが、きっと-fオプションを処理する箇所があるはずだと思いつきました。 -fオプションはPHPのスクリプトファイルを指定するオプションです。 普通は-fなんか使わずに直接ファイルのパスを指定しますが、-fオプションにもちゃんと対応しています。
getopt関数でコマンドライン引数を分解したあと、必ず'f'に対応する箇所があるはずと信じて検索しました。 sapi/cli/php_cli.cの613行目にdo_cliという関数が定義されていますが、どうやらこれがCLI版の本体のようです。 この中に-fオプションに対応するコードも書かれていました。
この調子で進めていくと、いったいいつまでかかるのかわかりませんが、とりあえずこんな感じでゆっくりしたペースで進めていきたいと思います。
今回はこの辺にとどめておきたいと思います。 平日はなるべくPHPの話題にしたいと思っていますので、続きは近いうちに書けると思います。 でも明日はもしかしたらZigかもしれませんけどね!
それでは!!