PHPのセッションとクッキーの関係を調べる。
次のファイルindex.phpをつくりブラウザでアクセスしてみる。
1 2 3 4 5 6 7 8 |
<html> <head> <title>MYTITLE</title> </head> <body> TEST </body> </html> |
このときのhttpヘッダ(行きと帰り)は以下のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
GET /webapp/cookie/index.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ja; rv:1.9.1.18) Gecko/20110319 Firefox/3.5.18 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive HTTP/1.1 200 OK Date: Sat, 23 Apr 2011 01:03:28 GMT Server: Apache/2.2.10 (Win32) PHP/5.2.6 X-Powered-By: PHP/5.2.6 Content-Length: 79 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html |
とくにクッキー関係はない。
つぎにindex2.phpを作り同様に実験してみる。
1 2 3 4 5 6 7 8 9 10 11 |
<?php session_start(); ?> <html> <head> <title>MYTITLE</title> </head> <body> <?php print_r($_COOKIE); ?> </body> </html> |
ヘッダは以下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
GET /webapp/cookie/index2.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ja; rv:1.9.1.18) Gecko/20110319 Firefox/3.5.18 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive HTTP/1.1 200 OK Date: Sat, 23 Apr 2011 01:08:32 GMT Server: Apache/2.2.10 (Win32) PHP/5.2.6 X-Powered-By: PHP/5.2.6 Set-Cookie: PHPSESSID=he08r7184t432launpk1ufpg94; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Length: 85 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html |
サーバからSet-Cookie: PHPSESSID=he08r7184t432launpk1ufpg94; path=/ というのが帰ってきた。print_rで表示した$_COOKIEはからだった。
ここでこのページをリロードすると以下のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
GET /webapp/cookie/index2.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ja; rv:1.9.1.18) Gecko/20110319 Firefox/3.5.18 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: PHPSESSID=he08r7184t432launpk1ufpg94 Cache-Control: max-age=0 HTTP/1.1 200 OK Date: Sat, 23 Apr 2011 01:10:34 GMT Server: Apache/2.2.10 (Win32) PHP/5.2.6 X-Powered-By: PHP/5.2.6 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Length: 131 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html |
$_COOKIEは以下のようになる。
1 |
Array ( [PHPSESSID] => he08r7184t432launpk1ufpg94 ) |
ここまでのまとめ
- 何もないところからアクセスするとサーバはSet-Cookieヘッダを返す。
- ブラウザはその情報を覚えておき、次にアクセスするときCookieヘッダでそれを送る。
index3.phpをつくり同様にやってみる。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php session_start(); $_SESSION['mysessname'] = 'mysessvalue'; ?> <html> <head> <title>MYTITLE</title> </head> <body> <?php print_r($_COOKIE); ?> </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
GET /webapp/cookie/index3.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ja; rv:1.9.1.18) Gecko/20110319 Firefox/3.5.18 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: PHPSESSID=he08r7184t432launpk1ufpg94 HTTP/1.1 200 OK Date: Sat, 23 Apr 2011 01:28:43 GMT Server: Apache/2.2.10 (Win32) PHP/5.2.6 X-Powered-By: PHP/5.2.6 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Length: 131 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html |
なんかいリロードしてもしても上記のヘッダになる。つまり$_SESSIONに書いたものはヘッダには反映されない。これはサーバに保存されている。
サーバのtmpディレクトリにはファイル”sess_he08r7184t432launpk1ufpg94″が作られており、内容は以下になっている。
1 |
mysessname|s:11:"mysessvalue"; |
つまりブラウザから送られてきた、Cookie: PHPSESSID=he08r7184t432launpk1ufpg94からこのファイルを見つけ出してPHPはこのファイルの内容を$_SESSIONに書き込むのだろう。
index4.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php session_start(); $_SESSION['mysessname2'] = ++$_SESSION['mysessname2']; ?> <html> <head> <title>MYTITLE</title> </head> <body> <?php print_r($_COOKIE); ?> <?php print_r($_SESSION); ?> </body> </html> |
これを読み込むとリロードするごとに$_SESSION[‘mysessname2’]の値が増えていく。
ここでブラウザを終了させ、再びこのページにアクセスすると、PHPSESSIDも変わり、$_SESSION[‘mysessname2’]も0にもどる。つまりブラウザはなにもファイルには保存してない。こういうクッキーは一時的なクッキーなのだろう。
横路にそれて、少し関数の実験結果。
session_name(“mysessname”);をsessioin_start()の前に呼ぶと、PHPSESSIDがmysessnameに変わる。
session_id(“mysessid”);をsession_start()の前に呼ぶと、he08r7184t432launpk1ufpg94のような文字列がmysessidに変わる。本来この文字列はクライアントがCookieを送ってこないときは自動で作られるが、この関数で固定するとクライアントがCookieを送ってこないときも、サーバに保存してある情報を取り出せる。
実験したところ、同じサーバ上の2つのバーチャルホスト上でおなじセッションIDを使うと、同じ値が読み込まれてしまった。
ここではPHPのセッションとクッキーの関係について書いたが、クッキーのことについては有効期限やドメインやパスについては書いてないのでまた調べたいと思う。そもそもPHPセッションはクッキー以外でもできる方法があるので、クッキーとは別の機構だからクッキーを考えるときPHPセッションを使わなくてもいいかもしれない。