なんで PHP は CGI と違って実行権限がなくても動くの?

Perl や Python を CGI として動かしたい場合、パーミッションを 755 とかにして実行権限を付けないといけない。しかし、PHP ファイルは 644 と実行権限を付与していなくても動作する。コレはなぜか。

この挙動は、以前調べた「シェルスクリプトファイルに実行権限を付与する必要性」に近い理由によるモノだった。

Perl や Python、Ruby などは、CGI という仕組みを通じて、ファイルそのものが直接実行されている。ターミナルで表現するなら、

$ ./example.cgi
$ ./example.pl

というように、コマンドを指定せず直接実行しているのと同じワケだ。だから1行目の #!/usr/bin/perl などというシバンが重要になってくるし、実行権限が必要になる。おさらいになるが、ココで拡張子はあまり関係ない。CGI として扱うことにする拡張子は設定で取り決められるものの、「.pl だから中身は Perl で動かすぞ!」というような判断には使われていないのである。

一方 PHP は、かつては CGI として動かす仕組みもあったようだが、現在はちょっと異なる仕組みで動いている。PHP だけは、Apache や nginx などのサーバに追加したモジュールが代わりに実行している。そういえば Apache の設定ファイルで mod_php みたいなのをいじったことがあるし、nginx では PHP だけ php-fpm とかいう違うモジュールで動かしていたと思う。

つまりは PHP ファイルだけは、

$ php ./example.php

と、「php コマンドで動かしますよー」的な引き渡しが行われているワケだ。コレなら、php コマンド (PHP 用の拡張モジュール) はファイルの読み取り権限だけあればよく、実行は php コマンドが肩代わりすることになる。

ふむ、だいぶ腑に落ちた。いまさらになって CGI 理解したし。