[PHP-users 32350] Re: スレッドとstatic変数の関係について
goungoun
gounx2 @ gmail.com
2007年 6月 30日 (土) 03:19:24 JST
こんにちは。
私もあまり深く考えたことはないのですが。
「プロセス」と「スレッド」がごっちゃなってるような。
で「HTTPリクエスト」もからんでさらにごっちゃになってるような。
Apache2にはMPMというものがあって、
・prefork(=Apache1.3と同じ仕組み)なら、
→複数プロセス起動して、リクエストを処理する。
→マルチスレッドは使っていない。
・worker なら、
→マルチスレッドとマルチプロセスのハイブリッドな仕組みで
リクエストを処理する。
で、PHPの場合
> > c).「PHPの一部の拡張モジュールはスレッドセーフではない
> > 為・・・」
ということです。
マルチスレッドで動かしたければ、
「Apache2(worker)+スレッドセーフでコンパイルしたPHP本体&拡張モジュール」
というように全てスレッドセーフに統一してね。ということ。
一方PHPの言語レベルでは、
HTTPリクエストをまたいでデータをやりとりするには、
SESSIONを使います。
# (スレッドセーフであろうとなかろうと)
# PHP上において、static としても、HTTPのリクエストを
# 超えて干渉することはできません。
というように、
PHPの言語レベルの話と、ApacheのMPMの話(PHPが動く環境周りの話)は
全く関係ありません。
# よくよく考えると、
# スレッドセーフかどうかで、PHPの言語仕様が変わると
# 困ってしまう。。。だからそういうことはあり得ない。
# と考えるのが綺麗なような(謎
ps.
気になって手持ちの環境をphpinfo()で見たのですが、
WindowsのXAMPPのPHP5.2は「Thread Safety enabled」
Debian(Linux)のPHP5.2は「Thread Safety disabled」
でした。
「PHPの一部の拡張モジュールはスレッドセーフではない」
という点から考えると「Thread Safety disabled」とするのが
妥当なんだろうと勝手に思っていたんですけど。
ネットで見つけた、Zend Optimizerの資料見ると、
Windows の場合、"enabled"
UNIX/Linux/Mac OS X の場合、"disabled"
であること。とあるので、これが当たり前なのかな。
--
goungoun <gounx2 @ gmail.com>
http://goungoun.dip.jp/app/
PHP-users メーリングリストの案内