PHPでウェブの世界と繋がろう!
menu
ホーム > PHPの文法 > 12 セッション > 12-1 セッション(SESSION)

12-1 セッション(SESSION)

Pocket

  • セッションは、
    サイトを訪れた個々のユーザーのデータを
    個別に管理する機能を提供する
  • セッションデータは、セッションデータコンテナに格納される
  • セッションデータは、
    一意な識別子(ユニークなID)セッションIDによって管理される
  • サーバー側のセッションIDとブラウザ側のクッキーに
    格納されたPHPSESSIDが一意な同一のIDであり、
    ユーザーを関連付け識別する
    ※PHPSESSIDは変更可能
  • セッションを利用するには、
    session_start()関数とセッション変数の
    $_SESSION(スーパーグローバル変数の1つ)を使用する
  • session_id()関数 セッションID確認
  • session_name()関数 セッション名確認
  • session_regenerate_id()関数 セッションID再発行
  • session_unset()関数 セッション変数開放
  • session_destroy()関数 全セッションデータの破棄
    ※クッキーのPHPSESSIDは削除されません
  • セッションはブラウザを閉じた時点で終了する
  • php.iniのsession.cookie_lifetimeで有効期限を設定できる
  • クッキー(cookie)が無効になっている場合は、
    URLのパラメーターとしてセッションIDを伝播する

セッションとは
POINT

  • セッションは、
    サイトを訪れた個々のユーザーのデータを個別に管理する機能を提供する
  • セッションは、
    連続するリクエストにまたがって特定のデータを保持する
  • セッションデータは、
    セッションデータコンテナに格納される
  • セッションデータは、
    一意な識別子(ユニークなID)セッションIDによって管理される
  • サーバー側のセッションIDとブラウザ側のクッキーに格納されたPHPSESSIDが一意な同一のIDであり、ユーザーを関連付け識別する

セッションは、サイトを訪れた個々のユーザーのデータを個別に維持することによって、ユーザーとサーバー間の状態を管理する仕組みを提供します。セッションを利用することで、各ユーザー毎に、連続するリクエストにまたがって特定のデータを保持することで、ステートフル(状態を保持する)なWebサービスの構築が可能になります。データをページ間で引き継ぐことによって、例えば、複数ページのフォームから成る問い合わせフォームやショッピングカートなどが作成できます。PHPではセッションを組み込みでサポートしています。

個々のユーザーのセッションデータは、セッションデータコンテナに格納され、ユーザーのリクエスト毎に更新されます。セッションデータコンテナの中では、一意な識別子(ユニークなID)によってセッションデータを管理しています。この識別子をセッションIDと言います。このセッションIDは、始めてサイトに訪れるユーザーへも発行され、PHPSESSIDという名前のクッキーで保存されます。セッションデータコンテナに格納されるセッションIDとブラウザのクッキーに格納されているPHPSESSIDは一意となっており、ユーザーを識別することが出来います。サーバー側のセッションIDとブラウザ側のクッキーに格納されたPHPSESSIDが一意な同一のIDであり、これによりユーザーを関連付け識別し、状態を管理する仕組みを実現します。

セッションのデータは各ページの頭で自動的に読み込まれ、ページの最後で自動的に最新情報が保存されます。このデータは複数のページ間で利用可能であり、各ページで更新した内容も引き継がれます。あるページで更新した内容は、どのページでも読み込みが可能であり、連続するリクエストに対して常に最新のデータが提供されます。セッションへのデータの保存や読み込みは、 session_start()関数をコールした後、PHPのスパーグローバル変数である $_SESSION を利用します。

//セッションデータを初期化
//セッションIDの新規発行、又は、既存のセッションを読み込む
//$_SESSIONを読み込む
session_start();

//変数をセッションに登録
$_SESSION['string'] = 'Hello World!';
//セッションを読み込む
echo $_SESSION['string'];

結果は

Hello World!

となります。

このようなセッション機能を活用することで、ショッピングカートやログイン機能などが実装できます。オンラインショッピングサイトなどで買い物をする際に、ユーザーがショッピングカートに入れた商品情報は、そのユーザーが買い物を完了させるまで、或いはサイトを離れるまで維持されています。ユーザーがカートに入れた商品情報はそのユーザーと関連付いています。また、認証が必要なサイトでユーザーがログインした場合、ログイン後、そのユーザーへのサービスが提供されます。サービスはユーザーがログアウトするまで、或いはサイトを離れるまでユーザーを識別して提供され続けます。

このように、セッションはユーザーを識別してそのユーザーに関連付いた個別の情報を保持する機能を提供するのです。

セッションを利用する
POINT

  • セッションを利用するには、session_start()関数とセッション変数の$_SESSION(スーパーグローバル変数の1つ)を使用する
  • session_id()関数 セッションID確認
  • session_name()関数 セッション名確認
  • session_regenerate_id()関数 セッションID再発行
  • session_unset()関数 セッション変数開放
  • session_destroy()関数 全セッションデータの破棄
    ※クッキーのPHPSESSIDは削除されません

セッションを利用するには、session_start()関数とセッション変数の$_SESSION(スーパーグローバル変数の1つ)を使用します。その他にセッション関連の関数をご紹介します。

session_start()関数

セッションを利用するには、まずページの最初でsession_start()関数をコールします。

<?php session_start(); ?>
<DOCTYPE>
<html>
<head>
・・

この関数をコールすると、新しくセッションIDを発行するか、または、既存のセッションを再開させます。新規にセッションIDを発行する場合は、新しいセッションを作成します。再開の場合は、セッションデータコンテナに登録されている内容をスーパーグローバル変数の$_SESSIONに読み込みます。読み込みは、ユーザーのブラウザに格納されているPHPSESSID(この名前は変更することが可能です)という名前のクッキーに格納されているセッションIDと、サーバー側のセッションIDを紐付けて行われます。この場合、クッキーではなく、$_GETや$_POSTによって渡されるセッションIDによって行われることもあります。これは、クッキーが使用できない場合にセッションIDを$_GETや$_POSTで伝播する場合になります。

session()関数でセッションをスタートさせた後、セッション変数の$_SESSIONを利用して、セッションにデータを登録したり、登録したデータを読み込んだりします。

<?php
//セッションデータを初期化
//セッションIDの新規発行、又は、既存のセッションを読み込む
//$_SESSIONを読み込む
session_start();
//変数をセッションに登録
$_SESSION&#91;'string'&#93; = 'Hello World!';
//出力
echo $_SESSION&#91;'string'&#93;;
?>

結果は

Hello World!

となります。

一度セッションに登録されれば、$_SESSION['string']は他のページでも読み込むことが出来ます。

<?php
session_start();
echo $_SESSION&#91;'string'&#93;;
?>

結果は

Hello World!

となります。

ユーザーがブラウザを閉じるまで、$_SESSION['string']は何時でも利用可能です。

session_id()関数

session_id()関数は現在のセッションIDを返します。

<?php
session_start();
echo session_id();
?>

以下のような値が返されます。

126uvgrpmd2v4uvk4ncpdnd11136rstu
session_name()関数

session_name()関数は現在のセッション名を返します。

<?php
session_start();
echo session_name();
?>

結果は

PHPSESSID

となります。
※この名前はデフォルトで設定されていますが、php.iniの設定で変更が可能です。セキュリティー上セッション名は予測されないものが良いとされています。変更は、php.iniのsession.nameディレクティブで指定します。

session_regenerate_id()関数

session_regenerate_id()関数は現在のセッションIDを再発行します。

<?php
session_start();
session_regenerate_id();
echo session_id();
?>

ページを読み込む度にセッションIDの値が更新されます。
この関数は、例えばユーザーがログインした際、機密性の高い情報を$_SESSIONに格納するなどした場合、新しいセッションIDを発行することでセッションIDの漏洩によるデータの盗聴リスクを下げます。

session_unset()関数

session_unset()関数は全てのセッション変数を開放します。

<?php
//セッション初期化
session_start();
//$_SESSIONに値を代入
$_SESSION&#91;'string'&#93;  = 'Hello World!';
$_SESSION&#91;'count'&#93;   = 1240;
$_SESSION&#91;'bool'&#93;    = TRUE;
//出力
echo $_SESSION&#91;'string'&#93;."<br/>\n";
echo $_SESSION['count']."<br/>\n";
echo $_SESSION['bool']."<br/>\n";
//セッション変数開放
unset($_SESSION);
//セッション変数内容展開
var_dump($_SESSION);
?>

結果は

Hello World!
1240
1
NULL

となります。

session_destroy()関数

session_destroy()関数はセッションに登録された全データを破棄します。

<?php
//セッション初期化
session_start();
//$_SESSIONに値を代入
$_SESSION&#91;'string'&#93;  = 'Hello World!';
$_SESSION&#91;'count'&#93;   = 1240;
$_SESSION&#91;'bool'&#93;    = TRUE;
//出力
echo $_SESSION&#91;'string'&#93;."<br/>\n";
echo $_SESSION['count']."<br/>\n";
echo $_SESSION['bool']."<br/>\n";
//セッション破棄
session_destroy();
?>

結果は

Hello World!
1240
1

となります。

session_destroy()関数をコールした後、他のページでセッションに登録した変数を読み込んでも値は表示されません。

<?php
//セッション初期化
session_start();
//出力
echo $_SESSION&#91;'string'&#93;."<br/>\n";
echo $_SESSION['count']."<br/>\n";
echo $_SESSION['bool']."<br/>\n";
?>

呼び出している変数そのものが無いので以下のようなエラーが表示されます。
※php.ini の error_reporting ディレクティブが E_ALL | E_STRICT の場合

PHP Notice:  Undefined index: string・・・・

これは、存在しない変数(初期化されていない変数)を扱った場合に出力されるエラーです。

この関数をコールしても、ブラウザのクッキーは削除されません。クッキーに保存されているPHPSESSIDの値は残ります。session_destory()関数を実行した後に、他のページでsession_start()関数でセッションを再開させた場合、セッションIDはsession_destory()関数をコールする前と同一のIDになります。PHPSESSIDに関連した$_SESSIONは空になっています。セッションによりログイン機構などを実装している場合、ユーザーがログアウトした際はセッションIDも破棄する必要があります。session_destory()関数に加えて、setcookie()関数でPHPSESSID名のクッキーを削除してください。

セッションクッキーを削除するコードの例です。ページの一番最初に記述して下さい。setcookie()関数はすべての出力の前に実行します。ヘッダー(header)情報、<DOCTYPE>タグ、<html>タグ、空白、echo、print などより前にコールする必要があります。

<?php
//クライアントのセッションクッキーを削除
$sSessionName = session_name();
if(isset($_COOKIE&#91;$sSessionName&#93;)){
    setcookie($sSessionName, '', time() - 1800, '/');
}
?>

セッションの終了
POINT

  • セッションはブラウザを閉じた時点で終了する
  • php.iniのsession.cookie_lifetimeで有効期限を設定できる

通常、ユーザーのブラウザに保存されたPHPSESSID名のクッキー(セッションID)は、ブラウザを閉じた時点で破棄されます。ブラウザを閉じればセッションが終了となります。次にサイトを訪れた際は、新しいセッションIDが発行され新規にセッションがスタートされます。

このセッションクッキーの有効期限を設定することが出来ます。php.iniのsession.cookie_lifetimeディレクティブで秒数を指定することで、ブラウザを閉じてもセッションIDが保存されたクッキーは削除されなくなります。

クッキー(cookie)が使用できない場合
POINT

  • クッキー(cookie)が無効になっている場合は、URLのパラメーターとしてセッションIDを伝播する

ユーザーの環境によっては、クッキーが無効にされていたり、そもそも利用できない場合があります。そのような場合は、クッキーにセッションIDが保存されずユーザーを識別することが出来ません。対応策としてURLにセッションIDを埋め込んで伝播する方法があります。php.ini の session.use_trans_sid ディレクティブが 1 となっている場合、自動的にセッションIDがURLのパラメーターとして追加されます。session.use_trans_sid ディレクティブを設定できない場合は、PHPの定数SIDを利用してください。この定数には、「name=ID」 形式でセッション名とセッションIDが格納されています。SIDはセッションIDがセッションクッキーに保存されている場合には空文字列が代入されます。

URLパラメーターとして送信されたセッションIDは$_GETで受け取ることが出来ます。

page1.php

URLパラメーターにセッションIDを記述する
<a href="http://www.tryphp.ne/page2.php?PHPSESSID=126uvgrpmd2v4uvk4ncpdnd11136rstu">次ページ</a>

定数SIDを使用してURLパラメーターに記述する
<a href="http://www.tryphp.ne/page2.php?<?php echo SID; ?>">次ページ</a>

page2.php

<?php
//フィルタ
$sessid = $_GET&#91;'PHPSESSID'&#93;;
//URLエスケープ URLエンコード処理
$url&#91;'sessid'&#93; = urlencode($sessid);
//リンク文字列作成
$link = "http://www.tryphp.net/page3.php?PHPSESSID={$url&#91;'sessid'&#93;}";
//httpクライアントエスケープ
$htmllink = htmlentities($link, ENT_QUOTES, 'UTF-8');
//出力
echo '<a href="'.$htmllink .'">URL</a>';
?>

セッション変数の$_SESSION
POINT

  • $_SESSIONは、PHPの定義済み変数の1つ
  • $_SESSIONは、現在のPHPのSESSIONに登録されている値の変数です。
  • $_SESSIONは、session_start(); 関数でセッションデータを初期化してから利用する
  • $_SESSIONは、連想配列として使用します。
  • $_SESSIONは、関数やメソッドの内部で使用する場合、 global $_SESSION; とする必要がありません。

$_SESSIONは、PHPの定義済み変数のセッション変数です。この変数は、現在のPHPのセッションに登録されている値の変数です。セッションデータはウェブサーバーの特定の場所(セッションデータコンテナ)に格納されています。

セッション変数の$_SESSIONを利用する前に、session_start()関数でセッションを初期化する必要があります。

$_SESSIONは、スーパーグローバル変数なので、スクリプトのコード中どこからでも使用することが出来る変数です。関数やメソッドの内部で使用する場合にも global $_SESSION; とする必要はありません。

$_SESSIONは、連想配列で使用します。

サンプルコード

– サンプル Click Here ! –

session.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
<title>セッション</title>
</head>
<body>

<h3>SESSION変数の登録と読み込み</h3>
<?php
//セッションデータを初期化する
session_start();

//セッション変数の$_SESSIONに連想配列として値を格納
$_SESSION&#91;'sitename'&#93; = 'PHPウェブプログラミングのTRYPHP';

//セッション名
echo 'セッション名は、 <b>[ '.session_name()." ]</b><br/>\n";

//セッションID
echo 'セッションIDは、 <b>[ '.session_id()." ]</b><br/>\n";

//$_SESSIONを読み込む
echo '$_SESSION[\'sitename\']の値は <b>[ '.$_SESSION['sitename']." ]</b><br/>\n";
?>
<br/><a href="session_2.php">次のページへ</a>
<br/><a href="session_2.php?<?php echo SID; ?>">次のページへ(クッキーが無効の場合のURL)</a>

</body>
</html>

session_2.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
<title>セッション</title>
</head>
<body>

<h3>SESSION変数の読み込み ページを移動しても$_SESSION['sitename']の値は利用できる</h3>
<?php
//セッションデータを初期化する
session_start();

//セッション名
echo 'セッション名は、 <b>[ '.session_name()." ]</b><br/>\n";

//セッションID
echo 'セッションIDは、 <b>[ '.session_id()." ]</b><br/>\n";

//$_SESSIONを読み込む
echo '$_SESSION[\'sitename\']の値は <b>[ '.$_SESSION['sitename']." ]</b><br/>\n";
?>

<h3>SESSIONの削除</h3>
<?php
//現在のセッションに関連づけられた全てのデータを破棄
session_destroy();

//個別に削除
//$_SESSION&#91;'sitename'&#93; = '';

//全てのセッション変数を削除
//$_SESSION = array();
?>
<br/><a href="session_3.php">次のページへ</a>
<br/><a href="session_3.php?<?php echo SID; ?>">次のページへ(クッキーが無効の場合のURL)</a>

</body>
</html>

session_3.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
<title>セッション</title>
</head>
<body>

<h3>前のページでsession_destory()を実行したので、SESSION変数は空になります</h3>
<?php
//セッションデータを初期化する
session_start();

//セッション名
echo 'セッション名は、 <b>[ '.session_name()." ]</b><br/>\n";

//セッションID
echo 'セッションIDは、 <b>[ '.session_id()." ]</b><br/>\n";

//$_SESSIONを読み込む
echo '$_SESSION[\'sitename\']の値は <b>[ '.$_SESSION['sitename']." ]</b><br/>\n";
?>
<br/><a href="session_4.php">次のページへ</a>
<br/><a href="session_4.php?<?php echo SID; ?>">次のページへ(クッキーが無効の場合のURL)</a>

</body>
</html>

session_4.php
※session_4.phpの一番最初DOCTYPEより前に以下のコードを記述して下さい。

<?php
//クライアントのセッションクッキーを削除
$sSessionName = session_name();
if(isset($_COOKIE&#91;$sSessionName&#93;)){
    setcookie($sSessionName, '', time() - 1800, '/');
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
<title>セッション</title>
</head>
<body>

<h3>セッションクッキーを削除したので、次のページでセッションIDが再発行されます</h3>
<?php
//セッションデータを初期化する
session_start();

//セッション名
echo 'セッション名は、 <b>[ '.session_name()." ]</b><br/>\n";

//セッションID
echo 'セッションIDは、 <b>[ '.session_id()." ]</b><br/>\n";
?>
<br/><a href="session_5.php">次のページへ</a>
<br/><a href="session_5.php?<?php echo SID; ?>">次のページへ(クッキーが無効の場合のURL)</a>

</body>
</html>

session_5.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
<title>セッション</title>
</head>
<body>

<h3>セッションIDが再発行されました</h3>
<?php
//セッションデータを初期化する
session_start();

//セッション名
echo 'セッション名は、 <b>[ '.session_name()." ]</b><br/>\n";

//セッションID
echo 'セッションIDは、 <b>[ '.session_id()." ]</b><br/>\n";
?>
<br/><a href="session.php">最初へ</a>
<br/><a href="session.php?<?php echo SID; ?>">最初へ(クッキーが無効の場合のURL)</a>

</body>
</html>

– サンプル Click Here ! –


タグ(=記事関連ワード)

日付

投稿日:2012年3月18日
最終更新日:2013年10月27日

関連記事

配列関数サンプル

このカテゴリの他のページ

この記事へのコメント

トラックバックurl

http://www.tryphp.net/phpref-session-2/trackback/