[PHP-users 32346] スレッドとstatic変数の関係について

長谷川 明彦 blu-cielo @ nifty.com
2007年 6月 29日 (金) 02:13:03 JST


いつも勉強させていただいています。
長谷川と申します。

スレッドとstatic変数の関係について質問させて下さい。

「class.php、requestA.php、requestB.php」ファイルを用意し、
以下の手順でアクセスします。
1.ブラウザを2つ起動する。(ブラウザA、ブラウザBとします。)
2.ブラウザAからrequestA.phpへアクセスする。
3.ブラウザAの処理がsleepされている間に、
    ブラウザBからrequestB.phpへアクセスする。
4.出力結果として以下のメッセージがブラウザに出力される。
# 出力結果 ブラウザA ---------------------
static変数=none
static変数=requestA

# 出力結果 ブラウザB ---------------------
static変数=none
static変数=requestB
static変数=requestB

出力結果から考えた場合、以下のような認識で間違いないのでしょうか?

a).多重同時リクエストがあった場合のstatic変数の値は、
    リクエスト(スレッド)間で干渉する事は絶対にありえない。
    (今回の例で言うと、ブラウザAの出力結果が
    「static変数=requestB」になる事はないという事です。)

b).static変数は、リクエスト内で共有されるものである。
    (ということは、もう$GLOBALSは必要とされないということですか?)

c).「PHPの一部の拡張モジュールはスレッドセーフではない為・・・」
    とマニュアルに記載されている為、?状態です。
    ただ単に、static変数はスレッドセーフということなのですか?

初歩的な質問ですいません。
以上、ご教授の程、宜しくお願い致します。


# 実行環境
# OS       :WindowsXP
# PHP      :PHP5
# Webサーバ:Apache2

# class.php -------------------------------
<?php
class StaticFooClass {
    public static $staticVar = 'none';

    public static function debugEcho() {
        echo 'static変数=' . self :: $staticVar . '<br>';
    }
}

class InstanceFooClass {

    public static function debugEcho() {
        echo 'static変数=' . StaticFooClass :: $staticVar . '<br>';
    }
}
?>

# requestA.php ---------------------------
<?php
require('class.php');

StaticFooClass :: debugEcho();
StaticFooClass :: $staticVar = 'requestA';
sleep(10);
StaticFooClass :: debugEcho();
?>

# requestB.php ---------------------------
<?php
require('class.php');

StaticFooClass :: debugEcho();
StaticFooClass :: $staticVar = 'requestB';
StaticFooClass :: debugEcho();

$fooClass = new InstanceFooClass();
$fooClass->debugEcho();
?>



PHP-users メーリングリストの案内