クッキーとセッション管理

ご注意

このページでは,もし可能ならクッキーを使います。 セッションクッキーですので,ブラウザを終了させればクッキーも消えます。

あなたは今回このページに 始めてですね(あるいはクッキーが保存されていませんね)。

再読み込みするか,別のページに行ってからもう一度このページを見てください。

<?php
  session_set_cookie_params(0, '/~okumura/');
  session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>私のホームページ</title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>

<p>あなたは今回このページに
<?php
  if (isset($_SESSION['cnt'])) {
    echo $_SESSION['cnt'], " 回目ですね。";
  } else {
    $_SESSION['cnt'] = 1;
    echo "始めてですね(あるいはクッキーが保存されていませんね)。";
  }
  $_SESSION['cnt']++;
?>
</p>

</body>
</html>

クッキーとは

クッキーとは,サーバがブラウザに発行するものです。

このPHPファイルや,このページからリンクされたPHPファイルの先頭には,次のように書いてあります。

<?php
  session_set_cookie_params(0, '/~okumura/');
  session_start();
?>

サーバに他のユーザがサイトを作っていない場合は,単に次のようにするだけでかまいません。

<?php session_start(); ?>

これは,

をクッキーにして,あなたのブラウザに食べさせようとします。 実際にあなたのブラウザがこのクッキーを食べるか捨てるかは自由です。

上の2行は,PHP のソースでは

<ul>
  <li>セッション名: <code><?php echo htmlspecialchars(session_name()); ?></code></li>
  <li>セッションID: <code><?php echo htmlspecialchars(session_id()); ?></code></li>
</ul>

と書いてあります。

セッション名は,無指定では PHPSESSID という文字列になります。

セッションIDはランダムな文字列です。

クッキーは通常はクッキーを発行したサイトのどのページからも読めます。 複数のユーザがサイトを作っている共用サーバでは,これでは他のユーザにセッションを盗まれてしまうので,

  session_set_cookie_params(0, '/~okumura/');

のようにして,/~okumura/ 以下だけで読み出せるようにしておきます(ただしフレームを使えばこの制限をかいくぐることができますので絶対に安全というわけではありません)。

クッキーはブラウザを終了するまで有効ですが,session_set_cookie_params 関数の第1引数(0 となっているところ)を例えば1000にしておけば,1000秒間有効になります。 サーバに他のユーザがサイトを作っていない場合は,第2引数を省略して例えば次のようにします。

<?php
  session_set_cookie_params(1000);
  session_start();
?>

セッション管理

セッション中では,$_SESSION['foo'] などといった変数がページを超えて使えます。

細かな点

クッキーとしてブラウザに送られるものはセッションIDだけです。 情報の実体は,でフォルトではサーバの /tmp ディレクトリの中にファイルとして入ります。 セッションの数だけファイルができます。

他の人がログインできるサーバで /tmp のようなところにファイルを置いておくのは危険かもしれません。 中身は見えなくても,セッションIDがファイル名からばれてしまいます。 置き場所を変えるには,PHPの設定ファイル php.ini

session.save_path = "/var/hoge/sessions"

のように指定するか,あるいはPHPファイル中の session_start(); の前に

session_save_path("/var/hoge/sessions");

のように指定します。 このディレクトリは管理人と apache にしか読み書きできないようにします。

セッション管理がうまくいかない場合は,php.ini

output_buffering = Off

となっていたら右辺を 4096 とかにしてみてください。


奥村晴彦

Last modified: 2010-05-02 08:23:16