menu
ホーム > PHPの文法 > 5 変数 > PHP $_SESSION(セッション変数)のすべて!【初心者向け基本】
PHPリファレンス

UPDATE:2021年06月13日

PHP $_SESSION(セッション変数)のすべて!【初心者向け基本】

PHP $_SESSION(セッション変数)のすべて!【初心者向け基本】 | wepicks!
PHP5 PHP7 PHP8


$_SESSION(セッション変数) 簡単まとめ

$_SESSION(セッション変数)とは

1 Minute Note

  • $_SESSIONPHPの定義済み変数(=スーパーグローバル変数)の1つ
  • $_SESSION現在のセッションに登録されている値の変数
  • $_SESSION連想配列として使用する
  • $_SESSION は、関数やメソッドの内部で使用する場合、global $_SESSION; とする必要がない

SESSION(セッション)の仕組み

1 Minute Note

  • セッションは、サイトを訪れた個々のユーザーのデータ個別に管理する機能を提供する
  • セッションデータは、セッションデータコンテナに格納される
  • セッションデータは、一意な識別子(ユニークな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を伝播する
PHPセッションは、サイトを訪れた個々のユーザーのデータを個別に維持することによって、ユーザーとサーバー間の状態を管理する仕組みを提供します。データは $_SESSION(セッション変数) によって提供されます。



$_SESSION(セッション変数)を利用してみる

セッションの仕組みは以降で詳しく説明しますが、PHP で セッション を使用するのは非常に簡単です。session_start()関数 をコールしてから $_SESSION(セッション変数)を記述するだけです。

セッションスタート と $_SESSION(セッション変数) の登録と呼び出し

実行結果
support@wepicks.net

session_start(); をコールしてセッションをスタートします。次に、$_SESSION['mail'] = 'support@wepicks.net'; で変数を登録して echo $_SESSION['mail']; で登録した変数を呼び出しています。登録した $_SESSION['mail'] の内容は、ページ遷移などしても呼び出し可能です。基本的にはブラウザを閉じるまで登録したセッションの内容は生きています。

session_id() や session_name() でセッションIDやセッション名を確認

session_id() で現在のセッションIDや session_name() で現在のセッション名なども容易に確認可能です。session_unset() で セッション変数の内容を開放することが出来ます。その後、再度 echo $_SESSION['mail'];で呼び出しても内容は表示されません。

実行結果
support@wepicks.net
kgek2dves7akmv3pq4qa5rjo02i86d9k
PHPSESSID

このようにセッションの仕組みは簡単に利用でき、非常に便利なものです。

セッション変数を個別に削除

session_unset(); や unset($_SESSION); を使用すると、セッション変数の登録内容がすべて消えてしまいます。個別にセッション変数の内容を初期化する場合は、以下のように記述しましょう。

実行結果
support@wepicks.net
https://wepicks.net/

https://wepicks.net/

$_SESSION['mail'] のみ削除されるので、$_SESSION['url'] の内容は呼び出しできます。


$_SESSION(セッション変数)とは

POINT

  • $_SESSIONPHPの定義済み変数(=スーパーグローバル変数)の1つ
  • $_SESSION現在のセッションに登録されている値の変数
  • $_SESSION連想配列として使用する
  • $_SESSION は、関数やメソッドの内部で使用する場合、global $_SESSION; とする必要がない

$_SESSIONは、PHPの定義済み変数のセッション変数です。この変数は、配列型の配列変数であり、現在のセッションに登録されている値から渡されたデータが格納されている変数です。

配列型である $_SESSION は、連想配列として使用します。$_SESSION['mail'] = 'support@wepicks.net'; echo $_SESSION['mail']; というような形です。

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


$_SESSIONはPHPの定義済み変数

$_SESSIONは、PHPの定義済み変数の内の1つの変数です。PHPには定義済み変数が複数あります。其の中の1つが$_SESSIONです。
PHPの定義済み変数はスーパーグローバル変数とも言います。
$_SESSION = PHPの定義済み変数 = スーパーグローバル変数
また、$_SESSIONは自動グローバル変数とも呼ばれます。
(PHPには定義済みの定数というものもあります。詳細はこちらを参照下さい。)

PHPの定義済み変数(=スーパーグローバル変数)

$GLOBALS
(グローバル変数)
・グローバルスコープで使用可能なすべての変数への参照
・連想配列として使用
$_SERVER
(サーバー変数)
・サーバ情報および実行時の環境情報
・連想配列として使用
$_GET
(ゲット変数)
・HTTP GET 変数
・連想配列として使用
$_POST
(ポスト変数)
・HTTP POST 変数
・連想配列として使用
$_FILES
(ファイル変数)
・HTTP ファイルアップロード変数
・連想配列として使用
$_REQUEST
(リクエスト変数)
・HTTP リクエスト変数
・連想配列として使用
$_SESSION
(セッション変数)
・セッション変数
・連想配列として使用
$_ENV
(環境変数)
・環境変数
・連想配列として使用
$_COOKIE
(クッキー変数)
・HTTP クッキー
・連想配列として使用

これら、PHPの定義済み変数は、プログラムコード中何処からでも使用することができます。関数の内部でも globalキーワードを使用せず呼び出すことが出来ます。このように、スーパーグローバル変数は非常に便利なものです。
通常、変数には有効範囲などのルールがあります。このルールは、PHPにおいて変数のスコープという宣言の場所とそれによる有効範囲として定められています。スコープには、「グローバルスコープ」「ローカルスコープ」「スタティック変数」「関数の引数」の4種類ありますが、これらすべてのスコープを持っているのがスーパーグローバル変数です。
変数のスコープについてはこちらを参照下さい。

※注意2:
ただし、スーパーグローバル変数は、関数やクラスメソッドの中の 可変変数 として使用することはできません。

可変変数についてはこちらを参照下さい。


セッションとは

POINT

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

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

個々のユーザーのセッションデータは、セッションデータコンテナに格納され、ユーザーのリクエスト毎に更新されます。セッションデータコンテナの中では、一意な識別子(ユニークなID 例:kgek2dves7akmv3pq4qa5rjo02i86d9k)によってセッションデータを管理しています。この識別子をセッション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_unset(); や unset($_SESSION); を使用すると、セッション変数の登録内容がすべて消えるので、個別にセッション変数の内容を初期化する場合は、以下のように記述しましょう。

実行結果
support@wepicks.net
https://wepicks.net/

https://wepicks.net/

$_SESSION['mail'] のみ削除されるので、$_SESSION['url'] の内容は呼び出しできます。

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

※SIDは、XSS関連攻撃の抑制のため、htmlspecialchars() を使用して出力します。

page2.php


サンプルコード

– サンプル Click Here ! –

session.php

session_2.php

session_3.php

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

session_5.php

– サンプル Click Here ! –


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

日付

公開日:2011年10月20日
最終更新日:2021年06月13日

配列関数サンプル

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

この記事へのコメント

トラックバックurl

https://wepicks.net/phpref-session/trackback/

page top