ネットワークプログラミング
演習
第14回 Cookie
前回の出席確認
なぜWebサーバ上ではチャットを作りにくいのか? 他者の発言をWebサーバに取りに行かねばならない 頻繁に更新すれば可能だが、そうするとサーバに負荷がかかる ➡ Webサーバには負荷をかけてはいけなくて、チャットのサーバには 負荷をかけてよいのか?/チャットのサーバには負荷がかからない のか? …かからない。なぜか?Webサーバとチャットサーバの違いは何か Webサーバは、情報を渡すと切断する 他者が発言していなくても更新を要求する必要がある チャットサーバは(会話が続く限り)接続したまま 他者が発言したことをサーバからクライアントに通知できる 2018.01.17 これが本質的な解答。 そもそも 「負荷」って何?前回の出席確認
push型情報 と pull型情報 Webページの閲覧は pull … Webサーバは pull されることしか考えていない構成に なっている チャットの場合、他者の発言は push で受け取るべき …双方向の通信が必要 リアルタイム性 「チャットはリアルタイムだから負荷が大きい」という 回答では、説明不足。 なぜ(Webサーバ上で実現しようとすると)負荷が大き いのか、その負荷はチャットサーバなら許容されるのか、 といった議論をしないと説得力がない。 2018.01.17余談:負荷
負荷には、必要な負荷と不要な負荷がある
例)ネットショッピングのサイトが、人気商品の発売当日に 注文が殺到して、高負荷になる …必要な負荷 例)新しい情報が無いにもかかわらず、更新要求が頻繁に やってきて、高負荷になる …不要な負荷に思える 2018.01.17今日のお題
Cookie
Cookie とは
Webサーバからクライアント(ブラウザ)に情報を 保存しておくように要求する この情報を Cookie という ブラウザは Cookie を保存しないことを選択できる ブラウザはWebサーバに閲覧要求を出すときに、 過去に受け取った Cookie を(あれば)送る 2018.01.17 Webサーバ ブラウザ 保存を要求 閲覧時にCookieがあれば URLと一緒に送るCookie に設定する値
名前 値 有効期限 ブラウザは有効期限を過ぎた情報を送らないと考えてよい ブラウザを閉じるまで、を指定することも可能 domain 設定するとブラウザはそのドメインのサブドメインにも情報を送る 省略すると、Cookie を送ったサーバだけが対象となる path 設定するとブラウザはそのパスの子孫パスにあるページにも情報を 送る 省略すると Cookie を送ったページと同じパスにあるページだけが 対象となる 2018.01.17PHP における Cookie の扱い
Cookie の受け取り ブラウザからの要求に Cookie が設定されていれ ば、連想配列 $_COOKIE に格納される Cookie の設定 setcookie を呼び出して設定する ただし、他に何かを表示する前に設定しなければ ならない 2018.01.17プログラム例:おみくじ
(再掲)
http://sun.ac.jp/prof/yamagu/2017NP/omikuji.php ソースコード: <HTML> <HEAD><TITLE>Fortune</TITLE></HEAD> <BODY> <?PHP $i = rand(1,4); if ($i == 1) { echo '大吉<BR/>' ; } else if ($i == 2) { echo '中吉<BR/>' ; } else if ($i == 3) { echo '吉<BR/>' ; } else { echo '凶<BR/>' ; } ?> </BODY> </HTML> 2017.12.20 1から4までの整数をランダム に生成して、変数$iに代入。 $iの値によって表示する内容 を変える。 このサンプルは、そのうち また使いますおみくじの改造
問題点:再読込すると結果が変わる
「今日の運勢は…」にしたいので、24時間は結果を 変えたくない。 おみくじはユーザごとに違う結果にしたい しかし、サーバ側でユーザ管理をするのは面倒 ➡Cookie を使う ユーザのブラウザごとに、結果を記録できる 2018.01.17Cookie を使ったおみくじのソース
<?PHP
define('COOKIE_NAME', 'omikuji2');
if (isset($_COOKIE) && (array_key_exists(COOKIE_NAME,$_COOKIE))) { $kuji = $_COOKIE[COOKIE_NAME]; } else { $kuji = rand(1,4); setcookie(COOKIE_NAME,$kuji,time()+60*60*24); } ?> <HTML> <HEAD><TITLE>Fortune</TITLE></HEAD> <BODY> 今日の運勢は...<BR/> <?PHP if ($kuji == 1) { echo '大吉<BR/>' ; } else if ($kuji == 2) { echo '中吉<BR/>' ; } else if ($kuji == 3) { echo '吉<BR/>' ; } else if ($kuji == 4) { echo '凶<BR/>' ; } ?> </BODY> </HTML> 2018.01.17 後半は改造前と ほぼ同じ。 この部分を 次ページで解説