• ベストアンサー

そもそも、外部変数はクライアント側とサーバ側で矛盾を来たさないのでしょうか?

phpには$_POSTなどがあり、これはクライアントサイドの情報をサーバサイドに送るシステムとも言えます. そして、一般的には,一つのサーバに対して、クライアントは複数います.(例 webサイト) 今,サーバSを利用しているクライアントA,Bがいるとします.一方、websiteでは、初期変数  $_POST["param"]=="initial"; とされています.クライアントの操作によって、この値は,変わっていきます.そうすると、クライアントAの操作によって  $_POST["param"]=="valueA" になった状態のときに、クライアントBが  $_POST["param"]=="valueA" を引きずって、処理を受けるとしたら都合が悪いです. 引きずる値は,   $_POST["param"]=="initial" でないと困ります.おそらく、PHPは、この点については対処してるんだと思います.どういう機構で対処されてると考えればいいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

セッションスコープで対処しています。 PHPに限ったことではありませんが、 サーバの扱う変数には、スコープ(使用範囲)が存在します。 調べてみましたが、PHPではこのスコープについての詳細な説明が書かれているサイトが見つからなかったので参考までに。 (基本的にJAVAが専門で、PHPは初心者なので間違いがあったら指摘して下さい。) 「アプリケーションスコープ」 アプリケーション全体を指します。 PHPではグローバル変数がこれに当たるのかな? ここに格納されていれば、質問者さんの言うように、 全員が共通で使用するので誰かが変えれば他の誰かにも影響します。 「セッションスコープ」 ブラウザを使用しているユーザごとに一意で一つだけ与えられる、変数格納空間とでも思って下さい。 ユーザが変われば格納空間も別に用意される為、使う変数がカブることはありません。 同じユーザにおいて、アプリケーションを使用中の間はずっと保持していたい値(例えばログイン時の認証データ等)を格納するのに使います。 PHPでは4.0から対応されたとか。 「リクエストスコープ」 ある画面から別の画面に移動する場合、HTMLではリクエストを飛ばしますよね? POSTやGETがそうです。 この、一回限りの、別画面に飛ぶ要求に格納する変数を詰められるのがリクエストスコープです。 よって、一度の要求が終わったら値は全て破棄されます。 画面A→画面B→画面C と複数回画面が切り替わっても保持しておきたい値などは先ほどのセッションスコープに格納するのが普通です。 「ページスコープ」 その画面限りで使用する変数のスコープです。 そのページで宣言してそのページでしか使用しないような変数は、これにあたります。 なお、スコープは、下位のスコープを包括します。 つまり、アプリケーションスコープの中にセッションスコープがいくつも存在して、さらにその中にリクエストが複数、そしてページが・・・といった感じになるのです。 アプリケーションスコープは、アプリケーションは一つしかないので当然一つしかありません。 リクエストはセッションに含まれるので、 全く意識しなくても、それぞれユーザごとに一意の値がセットされます。 なので矛盾は無いのです。 一応、PHPでの、セッションの使い方をURLに載せておきました。 スコープについて十分に理解した上でお使い下さい。

参考URL:
http://www.stackasterisk.jp/tech/php/php03_06.jsp
SariGEnNu
質問者

お礼

すごく,参考になるご回答です. ありがとうございます.このスコープのサポートによって、ネットワーク上で動作するプログラムも一台のコンピューター内でしか動かないプログラムと同じような書き方でも作れてしまうように思いました. スコープについては,もっと研究の余地があると思うので,これからも調べていくようにします.

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

PHPというよりWEBサーバーが1つのクライアントに1つのプロセスを割り当てるといった感じで、(別のWEBサーバーがそれぞれ立ち上がるといった感じ)で、各プロセスは、(割り当てられる領域とか)独立しているのでごっちゃになったりしません。

SariGEnNu
質問者

お礼

ご回答ありがとうございます.なるほど、サーバ所以の機能で、対処してるんですね.

  • bioche
  • ベストアンサー率50% (4/8)
回答No.3

基本的に、WEBのクライアントとサーバーのやり取りは、 リクエストと応答が1:1でおこなわれます。 クライアントから app.exe param1 param2 param3 を実行 サーバーが答えを返して終了。 これの繰り返しです。だから他のクライアントがどうだということは一切考える必要はありません。 ・・・。エクセルを何個立ち上げても、それぞれ独立して動くようなもの。 (厳密にはちょっとちがいますけど)

SariGEnNu
質問者

お礼

ご回答ありがとうございます. あまり,難しく考えなくてもいいって言うことに安心できます.

  • the845t
  • ベストアンサー率33% (246/743)
回答No.1

その為にファイルロックがあるという回答じゃだめなのかな?

SariGEnNu
質問者

お礼

ご回答ありがとうございます. ファイルロックでは不十分というか別の話だと思えます.多分,質問の意味は理解されていると思いますが、要するに、サーバ側の変数の値がクライアント毎に割り振っているような気配はないのに,実際の運用では,変数の値をクライアントユーザーの区別なしに一食単に使われるということはないと思います.このことをどう理解したらよいかと思っています.

関連するQ&A