[PHP-users 32351] Re: スレッドとstatic変数の関係について
長谷川 明彦
blu-cielo @ nifty.com
2007年 6月 30日 (土) 10:20:50 JST
長谷川です。お世話になっています。
ミワさん、kanonbellさん、goungounさん、ご教授ありがとうございます。
> 「プロセス」と「スレッド」がごっちゃなってるような。
> で「HTTPリクエスト」もからんでさらにごっちゃになってるような。
まさにgoungounさんが仰るとおりです(^^;
> 多分C/C++でのマルチスレッドアプリケーションの開発経験がおありなんじゃないでしょうか。
kanonbellさんが仰るとおり、JavaでのWebシステム開発経験があります。
何が疑問かといいますと、単一のHTTPリクエスト内で、
「class.php」のようなクラス(あくまで例です。)を用意し、
StaticFooClassを他のクラス/PHPファイルから操作した場合、
Apache2の設定(prefork、worker)に関わらず、
StaticFooClass :: $staticVarの中身が
保障(スレッドセーフ)されるのかどうかを知りたかったのです。
始めからこの例を出してしまうと、
「保障される/されない」の一言で終わってしまいそうで、
今後の為にも、なぜ「保障される/されない」のかを
教えていただきたかったので、回りくどい言い方をしてしまいました。
申し訳ございません。
それと、ミワさんから教えていただいたマニュアルを見た時に、
関数内でのstatic変数の扱いはわかっても、
「class.php」のようにクラス変数として定義した場合、
以下のようなアクセスが出来てしまう為、
単一のHTTPリクエスト内であれば、
ローカル関数スコープでは無くなってしまいますよね?
(これはstatic変数を利用したテクニックになるのかな?)
StaticFooClass :: $staticVar['hogehoge'];
StaticFooClass :: getVar('hogehoge');
となると、$GLOBALSは必要なくなるのでは?といった疑問もあるのです。
お手数をお掛けして申し訳ございません。
ご教授の程、宜しくお願い致します。
# class.php -------------------------------
<?php
class StaticFooClass {
public static $staticVar = array();
public static setVar($key, $val){
self :: $staticVar[$key] = $val;
}
public static getVar($key){
return self :: $staticVar[$key];
}
public static function debugEcho() {
foreach(self :: $staticVar as $key => $val){
echo $key .'=' . $val . '<br>';
}
}
}
PHP-users メーリングリストの案内