環境構築していて、moduleが見つからなかった
libphp5-zts.soなるものを見つけたので、libphp5.soの代用で使えるかなと思って突っ込んだら、phpinfoが表示されたので、いけたわと思い、作業続行していたら、 php-mysqlとphp-gdがどうしても読み込まれず、致し方なく、libphp5.soを探す旅に出た。見つけて作った話はこちら。
検証環境を構築する上で知ったことパート2
で、その時に感じたこのztsって何だよお前っていう話をします。
ZTSの正体
ZTS(Zend Thread Safe)はMPMの中でも、マルチスレッドモデルを司るmoduleに与えられている名前。
これだけでは何のこっちゃわからん。
そも、MPMとは。
MPM(Multi Processing Module)の略。
Apacheは webサーバー。ならば複数のクライアントからのリクエスト処理をするためには何が必要か、それは並列処理である。そして、この並列処理には種類があり、その種類ごとに各種moduleが用意されていて、それらを総称して、MPMと人は呼ぶ・・・みたいですね。
以下に、その並列処理モデルを示す。
マルチプロセスモデル
クライアントからのリクエストをコピーして子プロセスとして生成、その子プロセスにリクエストの処理を任せるという方式。子プロセスの生成される場所が、親プロセスのアドレス空間内なので、レスポンスが遅いということです。ただ、メモリ空間はプロセス毎にに独立して生成されるので、スクリプト言語などを組み込みやすいことや、資源の競合について考える必要がないことなどがメリットです。
マルチスレッドモデル
クライアントからのリクエストがあるとスレッドを生成するか、リクエストを見越してスレッドを先に立てておくという2つのタイプがあるらしいです。スレッド生成のため、プロセスのようにコピー作業が発生しないので、オーバーヘッドが少ないくなるようです。メモリ空間をスレッドで共有で使うので資源の競合を防ぐように配慮する必要があります。
イベント駆動モデル
上記2つのマルチモデルとは異なり、まずリクエストを待ち受けてレスを返すというシーケンスを持たないです。1つのプロセスで処理します。 プロセスやスレッドを使用しないので、メモリ消費されないことが利点です。マシンのコア性能がモノを言います。
preforkとworker
<IfModule prefork.c>
LoadModule php5_module /etc/httpd/modules/libphp5.so
</IfModule>
# <IfModule worker.c>
# LoadModule php5_module modules/libphp5-zts.so
# </IfModule>
moduleを読ませるディレクティブに、マルチモデルを選ばせるようになっています。preforkがマルチプロセス、workerがマルチスレッドをそれぞれさしています。
modと名のつくmoduleを、/usr/lib/php/module/で見つけると思いますが、それらは全てマルチプロセスに対応しており、マルチスレッドでは使えません。私の場合、libphp5-zts.soモジュールをこのパス直下に入れてphpinfoが表示されて動いたと錯覚してしまった原因は、php自体は動いても、周辺のmoduleは動かない、という状況だったのではなかろうかと考えています。レゴブロックの別の色でも同じ形だから嵌め込めますが、色が気にくわないから作品としてダサくなっている状況と同じですね。
というわけで、処理方式を理解した上で、moduleを読ませましょうねというお話。