PHPのスレッドセーフ

ウェブサーバに入れるPHPって、
スレッドセーフ版とノンスレッドセーフ版が存在する
ってことを今更ながら知った・・・!
今のサーバも特に何も考えずに構築しちゃってるよ・・・

知った切っ掛けが、仕事でウチのサーバを参考にしつつ、
新たなウェブサーバを構築していたんだけど、
ほぼ同じ手順で構築しているのに、
いざApacheを起動しようとすると

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.

ってエラーが出てきて起動できなくて、
調べていくとPHPのスレッドの問題に行き着いた。

ApacheのMPMをworkerとかeventとか
マルチスレッドの環境で動かす時は、
PHPもスレッドセーフじゃなきゃダメだよーってヤツ。

スレッドの話自体は、ソフト開発をやってると、
「まぁ当たり前だよねー」って話なんだけど、
ここで別の疑問が・・・

今のウチのサーバのApacheは、MPMがeventで動いてるけど、
特にスレッドセーフとか全く考えてないのに、
なんで普通に動いてるの・・・?

まずphpinfoの出力を見てみると、
ちゃんとスレッドセーフで動いてた。
と言うことは、逆になんで今回構築してるサーバは、
スレッドセーフになってないの??

ネットで調べてると、PHPをスレッドセーフにするには、
configureのオプションに「–with-tsrm-pthreads」とか
「–enable-maintainer-zts」を付けるって見掛けたんだけど、
そもそも今のウチのサーバでは付けた覚えがない。。。

configureしたときの出力を見てると、確かに

checking whether to enable thread-safety...yes

と何かを判断して設定してるっぽい出力が出ていたから、
仕方なくconfigureの中身を追い掛けてみる・・・
すると、割と簡単に分かった^^;

configure実行時にApacheのMPMを確認して、
自動的に判断しているみたい・・・!

元々ウチのサーバを構築したときは、
Apacheの動作を確認してからPHPの構築をしたから、
ちゃんとMPMを認識してスレッドセーフになっていたけど、
今回のサーバは、既にPHPの設定まで済んだhttpd.confを流用して、
そのままだとApacheが起動できない状態でPHPを構築したから、
MPMの状態が取得できずにデフォルトでビルドされたんじゃないかな?(予想)

1度Apacheが正常に起動できるようにhttpd.confを書き換えてやると、
同じconfigureのオプションでもスレッドセーフに変わった^^;

そもそも以前のApache2.2まではMPMの設定がビルド時だったから、
MPMを変更するときはPHPもリビルドが必要ってのも普通なんだよね。
でも2.4からは、ロードするモジュールを切り替えるだけで
MPMの設定ができちゃうから、Apacheの設定を変えただけなのに、
PHPのリビルドが・・・なんてコトに^^;

とりあえずPHPがスレッドセーフかノンスレッドセーフかは、
configureさんが賢く判断してくれるから、
Apacheを構築してからPHPを構築すれば気にする必要なかった!
逆に言えば、今回みたいに一気に構築する時とかは、
間違って判断されないように気を付けないとね^^;

じゃ、ゲームして寝るー
バイニー☆

test?

コメントを残す