読者です 読者をやめる 読者になる 読者になる

PHP5.3どのビルドを使うのか

PHP

http://windows.php.net/download/

にて、計4種類のPHP5.3 Windowsバイナリが配布されています。というか、すでに5.2の時点で2種類ありましたが。これらのうち、どれを選ぶべきかという基準について、軽く調べたり推測したりしたメモです。

VC6かVC9

これは、PHP を入れたいWebサーバをビルドしたコンパイラに合わせるのための選択肢です。Visual C++ は、.net登場時期とVista登場時期に、ものすごく大きな変更が起こっています。VC6世代に書かれたものは、よほど気をつけていないかぎり、今のマイクロソフトの開発環境とのバイナリ互換性がありません。

WindowsのApacheは、VC6でビルドされたバイナリが配布されています。いっぽう、Windows Server 2008 や Visual Studio 2008 に含まれる最新の IIS(もしかして2003にもSPとして入るのかな)は、VC++ 2008 (バージョン9) と同等な、Windows SDK 6(旧 Platform SDK/Vista用にリリースされたとき名称を変更) でコンパイルされています。…たぶん。

現行の Windows Apache バイナリをインストーラで入れた人は、VC6を選びましょう。将来 Windows 7 完全対応ビルドが出ないかぎりは。

最新のIISを使う人は、VC9を選択しましょう。試してませんが、たぶんそういう意図です。

スレッドセーフか非スレッドッセーフか

これは、Apacheが並列にリクエストを処理するときの動作に依存します。

http://httpd.apache.org/docs/2.2/ja/mpm.html

Apacheには大きく分けて2種類のマルチプロセッシングモジュール(MPM)があり、一方は古臭いプロセスフォーク(prefork)で、もう一方はちゃんとしたプロセス内マルチスレッド(worker)です。

WindowsのApacheなら、普通はデフォルトでworker相当です。マルチスレッドだと、同時に来たHTTPリクエスト同士が同じメモリ空間にアクセスする可能性があるので、同期処理が必要です。当然、非スレッドセーフな、同期処理のないPHPモジュールを呼び出すのは大問題です。なので、Apache モジュールとしてインストールする場合は、スレッドセーフを選びます。

MPM=prefork な UnixApache では、モジュールインストールの場合でも、非スレッドッセーフでいいみたいです。

いっぽう、CGI としてPHPを使いたい場合、MPMに関係なく、いちいち新たなプロセスが立てられます。異なるプロセスになっていれば、OSが個別のメモリ空間を割り当てるので、メモリを侵食し合うことはありません。なので、非スレッドセーフでかまわないというわけです。

しかも、なにやら、IISFastCGIとしてPHPをセットアップするときは、非スレッドセーフ版でないとダメらしいです。ホントか嘘かはわかりませんが。

うーん、最新IISのISAPIだとVC9のスレッドセーフが正解なのかなぁ…。使わないからまあいいや。


ちなみに、Unix系OSではそもそも、同じひとつのソースコードが、コンパイルした環境にあわせて化けます。HTTPサーバをコンパイルした環境と同じ環境でPHPをコンパイルすれば、コンパイラの互換性問題もなく、また、configureスクリプトがデフォルトで適切なオプションを選んでくれます。つまり、Apacheのコンパイル時に選択したMPMを、おそらくPHPのconfigureが勝手に検出してくれる、ということです。

Linuxディストリビューションによっては、何も考えなくても最適なバイナリがインストールされるから、これが一番楽チンかも。


しかし、PHPは難しいなぁ。どのWindowsバイナリを選ぶべきか、ここまで考えてやっと、お試しインストールに踏み切れるんだもんなぁ。そのうちホントにインストールしてみようかな。ubuntu の apt-get でも5.3に更新できるようになったら、Windowsでもやってみようっと。

余談

さっき、php thread safe でググったら、2番目に出てきたのがコレ…。
ひでぇ。

http://okwave.jp/qa2326056.html

勝手に回答すると、

  • そのLinuxに入っているApacheがMPM=preforkでコンパイルされたものでないか
  • PHPのconfigureが適切にApacheのMPMを検知できているか

というのが、たぶん、質問者の欲しかった「条件」なんでしょう。

prefork なら Thread Safety が enable になっていなくても、全く意味がありません。勝手に disable になってくれて、ありがたい。仮に enable にできたとしても、無駄な同期処理負荷とデッドロックのリスクしがわずかに増えるだけでしょうね。

それより回答者さ。Roxen がどうとか SGI State Therad がどうとか関係ないし…。意味あるのは、pthread 使う POSIX のやつだけで、それってデフォルトでオンじゃんか…ってここまで言わないと、回答者は理解できないでしょうよ、きっと。あるいは、

printf("%s --help | grep -i %s\n自分で調べろ初心者め", command, keyword);

っていうボットなのかも。

なんか、このOKWaveのやりとりと、それがGoogleで2番目だってことが、PHP の社会的な有様を比喩しているようで、えもいわれんや、ものぐるをしけれ。