[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 メーリングリストの案内