menu
ホーム > PHPの文法 > 12 セッション > 12-1 PHP セッション(SESSION)
UPDATE:

12-1 PHP セッション(SESSION)

PHPリファレンス
  • セッションは、
    サイトを訪れた個々のユーザーのデータを
    個別に管理する機能を提供する
  • セッションデータは、セッションデータコンテナに格納される
  • セッションデータは、
    一意な識別子(ユニークな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 を利用します。

結果は

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()関数をコールします。

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

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

結果は

Hello World!

となります。

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

結果は

Hello World!

となります。

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

session_id()関数

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

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

126uvgrpmd2v4uvk4ncpdnd11136rstu

session_name()関数

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

結果は

PHPSESSID

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

session_regenerate_id()関数

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

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

session_unset()関数

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

結果は

Hello World!
1240
1
NULL

となります。

session_destroy()関数

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

結果は

Hello World!
1240
1

となります。

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

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

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

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

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


セッションの終了

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

page2.php


セッション変数の$_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

session_2.php

session_3.php

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

session_5.php

– サンプル Click Here ! –


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

日付

公開日:2017年8月8日
最終更新日:

関連記事

配列関数サンプル

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

この記事へのコメント

トラックバックurl

http://wepicks.net/phpref-session-2/trackback/

page top