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