PHPのモジュール版とCGI版の違い

XREAでの現状

現在public_htmlとshared_html共にモジュール版(mod_php)が 使われることになっています。 *1

"*.php"のファイルはPHPとして解釈されます。 この場合の動作はモジュール版PHPです。 CGI版PHPで動作させたい場合は"*.cgi"としてファイルの先頭に PHPへのpathを書く必要があります。

二つの違い

まとめてみました。*2

モジュール版CGI版備考
拡張子.php.cgi(先頭にpathが必要)
実行者ApacheのユーザースクリプトのオーナーCGI版はseEXECの効果があるため。
スクリプトのパーミッション604700詳しくはパーミッションにもあります。
ディレクトリのパーミッション705(ファイルの作成等がある場合は707)705(CGIから読み込むデータのみを置く場合は700)
設定ファイルのパーミッション604600
データファイルのパーミッション606600
速度高速低速
負荷低い高い
セキュリティ低い高い
制限セーフモード無しセーフモードの影響は[PHP: セーフモードにより制限を受けるか無効となる関数 - Manual]を参考。

どっちがいいの?

一概には言えません。 負荷を考えればモジュール版は極めて優秀です。 簡単なものであればCによるCGIよりも高速です。 しかし、suEXECが働きませんので、 パーミッションを緩くせざるを得なくセキュリティーが低めです。 隠したいデータファイル等が他人に覗かれる可能性は僅かばかりあります*3。 また、セーフモードの制限により動作しない場合もあります。

セキュリティ上どうしても、とか、 セーフモードでは動かない等があればCGI版を使うしかありませんが、 それら特別の理由がない限りモジュール版で十分です。

怪しい噂

本当にモジュール版PHPはもっとも高速なのでしょうか? 現在、他にモジュールを利用したCGIと同じ機能を実現するものはありません。 JSPやmod_perl、mod_ruby、mod_fastcgi等があるのであれば*4、 mod_phpが最速とは言えませんが、 mod_phpしかない現状では最速です。

と言う話は、半分本当で半分嘘です。 私が測ったわけではありませんが、 どこかのサイトにあるグラフが載ってました。 複雑で時間のかかる演算をやらせたところ mod_phpがPerl/CGIに途中で追い抜かれてしまいます。 これはPHP自体がとても遅い言語だからです。 つまり、あまりにも複雑な処理をやらせた場合、 mod_phpのプロセス起動無しによる負荷軽減が PHP自体の重さによって相殺されてしまうのです。

もし、とても複雑で重いCGIを組む場合は、 CやPerlと言った軽い言語をお勧めします。 *5

Rubyはどうなんだって?

・・・

聞かないで…。

*1仕様が変更された経緯は [SB:thread=5301]で 見ることが出来ます。

*2xhtml版のみ提供。

*3 パーミッションを604、606、705、707等にした場合は、 通常のサーバ内の他のユーザーからのアクセスはグループが同じですので 弾かれると思いますが…。 しかし、http経由のユーザーからは丸見えです。

*4 fastcgiは存在しますが、rootのみしか使えず一般ユーザーは使用不可です。

*5もっとも、それほど重いCGIを共有サーバで動かすこと自体が 馬鹿げていますが。