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

goungoun gounx2 @ gmail.com
2007年 6月 30日 (土) 22:20:00 JST


こんにちは。

「言語仕様としてマルチタスクなプログラムが組めるか?」
という話と「言語の実行環境がマルチタスクで動作するか?」
という話がごっちゃになってるような・・・

JavaならThreadクラスを使えばマルチタスクなプログラムを書けますが、
PHPにはそもそもマルチタスクなプログラムを書く手段が提供されていません。

PHPの実行環境は、コンパイルオプション次第で、
スレッドセーフになったり、ならなかったりします。

PHPは、CGIの延長として発展してきた経緯から、
言語仕様としてマルチタスクなプログラムを組める必要性
というのは少なかったんでしょうね。

HTTPプロトコルがステートレスというのはあたりまえ。
↓
プログラム自体がリクエスト毎に起動&終了を繰り返す
のはあたりまえ。
↓
保持する必要があるリソースは、ファイルやDBに保存しておけば
いいじゃん。
↓
プログラム起動時に、ファイルやDBから読んで、
プログラム終了時に、ファイルやDBに書きこむ。
でいいじゃん。

というのがPHP的なあたりまえ。

# 「$_SESSIONはメモリレベルで、セッションを越えて
# データ共有してるんじゃないの?」とか言われそうですけど
# SESSIONの実装レベルの話をすると、末端ではファイル経由で
# 実現しています。あたかも「メモリレベルで共有しているように
# 見せかけている」だけです。
# もっとも、*$_SESSIONの見せかけ*が巧妙?すぎて
# 見せかけだと知らない人は、何かの弾みでさらに混乱する
# というパターンがよく見受けられますが。

ところが、Javaは、

HTTPプロトコルがステートレスというのはあたりまえ。
↓
ステートレスってなんだ?
↓
ステートフルに使えるフレームワークを作ってしまおう。
↓
サーブレットっての作ったよ。
↓
リソースをメモリ上に保持しておくことが
できるようになったよ。

というのがJava的なあたりまえ。

# PHPには言語レベルでメモリレベルで共有という概念が無いから
# その点ではシンプルになってる。当然、スレッドというややこしいことも
# 考えなくて良い。その代わり、毎回DBやファイルからデータを
# 持ってくるので、そこはオーバーヘッドになるのかな。


それと、

On Sat, 30 Jun 2007 14:55:02 +0900
Tomoyuki Asakawa <tom @ asakawa.ne.jp> wrote:
> ところで
> 
>  >JavaのWebアプリ(Servlet)ではクラスのインスタンス 
> 変数さえも
>  >場合によっては競合をおこしてしまい、バグの原因になる事もありま 
> す。
> 
> これって事実ですか?
> 仮に事実としても、これも、javaの仕様の問題ではなく
> その、クラスの実装上の問題ではないのですか?
> そうじゃないと、オブジェクト指向言語の根幹に関わる話になって
> javaなんて使えねー!になってしまうとおもいます。

# 先に書いたことと被りますが、
Javaは、Threadクラスというものを使えば
マルチタスクなプログラムを書けます。
で、その使い方をミスるとインスタンス変数の競合が
発生するんです。

似たような別例を挙げると、
DBの複数テーブルをUpdateするとき
ロック(排他制御)のことを考えないと、データの整合性が壊れますよね?
1ユーザで使っている限りは、この問題が表に出ることはありませんが、
複数ユーザで使って初めて「あれっ?」となります。

基本的に「同じリソースを複数の人で取り合うことに
付き物な話(排他制御の話)」であって、
言語うんぬんの話ではないと思います。


ps.
Javaは表面上しかやってないので、間違ってたらごめんなさい。

-- 
goungoun <gounx2 @ gmail.com>
http://goungoun.dip.jp/app/



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