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