こんにちは!フリーエンジニアのせきです。
PHPに限らず、Webプログラミングにおいてセッションの概念は避けては通れません。
ユーザーがログイン・ログアウトするようなシステムが出来るのは実はセッションのおかげなのです。
この記事では、まず
・セッションとは
・セッションの使い方
で、セッションと言うものがどういうことかと言うことと、PHPでの具体的な利用方法について説明します。
今回はそんなセッションの使い方について、わかりやすく解説します!
・セッションの有効期限について知りたい
・ログイン機能でのセッションの使い方を知りたい
・セッション情報をデータベースで管理する方法を知りたい
といった応用的な内容に関しても解説していきます!
この記事の目次
セッションとは
PHPにおけるセッション(session)の具体的な使用例について説明する前に、まずは概念そのものについて説明します。
そして、それがPHPにおいてどのように使用されているかについても説明します。
セッションの概念
セッションとはWebサイトにアクセスして行う一連の行動を示します。
Webサイトにアクセスしてそのサイトから出て行くかブラウザを閉じるまでが1セッションとなります。
Webサーバはセッションごとに一意のIDを持ちこれを使用することで複数ページにまたがるWebシステムであってもユーザごとの情報を保存し使い続けることができます。
このセッションを用いる方法で最も典型的なのがWebページで最もよく用いられるのがログイン・ログアウトの機能です。
ログインをしてからログアウトをするまでを一つのセッションと考えその間ユーザーIDやパスワードなどのステータスを保存します。
セッションを使う理由
では、セッションはなぜ必要なのでしょうか?
実はWebで用いられるHTTPプロトコルには状態を管理する方法が無いからです。
つまり、あるWebページに、どんな人が何回アクセスしたのかとか、どういう経緯でアクセスしたのかとった情報をHTTPプロトコルでは保持できないのです。
それを補う意味であとからセッションと言う概念が導入されたのです。
PHPにおいてセッション情報を保持するための変数として、スーパーグローバル $_SESSIONが用意されています。
セッションとクッキー(Cookie)
なお、セッションと似た概念にクッキー(Cookie)と呼ばれるものがあります。
これもステータスを保存するためのものですがクライアント側に全ての値を保存させますから、基本的に違う概念です。
ただ、セッションの状態を一時的にクッキーに保存することも有りますから、相互に深い関係にあることは間違いありません。
ちなみに、クッキーを扱うスーパーグローバルとして、PHPには$_COOKIEが用意されています。
セッションの使い方
セッション管理を開始する
セッション管理を開始するには、session_start関数を使用します。
session_startは新しいセッションを開始します。既に開始されている場合は、そのセッションを再開します。
これを実行することで、セッション管理ができるようになります。
セッションへの変数の登録と削除
すでに説明したとおり、セッションのデータは、スーパーグローバル$_SESSIONがキーと値のペアで管理します。
セッションに変数を登録するには以下のように記述します。
以下は、セッションに変数を登録するサンプルです。
「session_start();」でセッション管理を開始します。
isset関数は、変数がセットされているかどうかを返す関数です。「isset($_SESSION[‘count’]」で、セッションにキー’count’が登録されているかどうかを判断しています。
登録されていなければ「$_SESSION[‘count’] = 1;」で1を登録し、登録されていれば「$_SESSION[‘count’]++;」でその値をインクリメントします。
実行結果は、初めてアクセスした場合です。
同じブラウザでアクセスすると、訪問回数はインクリメントされていきます。
違うブラウザからアクセスすると、それは違うセッションになるため訪問回数は1から始まります。
登録した変数を削除するには、unset関数を使用して以下のように記述します。
次はセッションから登録した変数を削除するサンプルです。
このサンプルを実行すると、「echo $_SESSION[‘count’];」で値がないため、以下のようなエラーが発生します。
セッションの有効期限を設定する方法
セッションには有効期限があります。
有効期限を過ぎると、セッションで保持されていた情報は削除されます。
ログインしていたWebシステムを放置し、再度ログイン要求がきたり、ショッピングサイトで買い物かごに入れたまま放置し、買い物かごが空になっていたりするのは、セッションの有効期限を過ぎたためです。
デフォルト値はphp.iniの「session.cookie_lifetime」に設定されている秒数です。
デフォルトでは0が設定されており、ブラウザが閉じるまで有効となります。
この値はプログラムから上書きすることができます。
今回は2つの方法をご紹介します。
session_start関数による設定
1つ目はsession_start関数のオプションとして、有効期限を指定する方法です。
PHP7.0.0からsession_start関数にオプションを指定し、php.iniのセッションに関する設定を上書きすることができるようになりました。
有効期限を上書きするには、以下のように記述します。
有効期限を秒数で指定します。
2つ目はセッションを開始する前にsession_set_cookie_params関数を使用する方法です。
引数について、順番に解説します。
・有効期限
有効期限を秒数で指定します。
・ドメイン上のパス
サーバー上でクッキーを有効としたいパスを指定します。 スラッシュ(’/’) をセットすると、クッキーはドメイン配下の全てのパスで有効となります。 デフォルト値は、クッキーがセットされたときのカレントディレクトリです。
・ドメイン
クッキーを有効としたいドメインを指定します。
・セキュアな接続の場合のみクッキーを送信するかどうか
TRUEを設定すると、HTTPS接続の場合にのみクッキーが送信されるようになります。デフォルトはFALSEです。
・HTTP通信の場合のみクッキーにアクセスするかどうか
TRUEを設定すると、HTTP通信のみクッキーにアクセスをすることができ、JavaScriptのようなスクリプト言語からはアクセスできなくできます。
以下にセッションの有効期限を設定するサンプルを示します。
先ほどと同じ処理をしているプログラムですが、セッション管理を開始する前に「session_set_cookie_params(60 * 5);」で、セッションの有効期限を5分に設定しています。
このように設定すると、5分間はブラウザを閉じても、同じブラウザであれば訪問回数がインクリメントされていきます。5分間アクセスがなければ、また訪問回数は1から始まります。
「session.cookie_lifetime」は、セッションIDが保存されているクッキーの有効期限です。
php.iniでは「session.gc_maxlifetime」で、サーバのセッションファイルを削除する秒数の設定もできます。
「session.cookie_lifetime」が0(ブラウザが閉じるまで有効)であっても、「session.gc_maxlifetime」の設定によりセッションが切れることがあるのに注意してください。
ログイン機能におけるセッションの使用方法
WebシステムのユーザID、パスワードなどによるログイン機能は、通常セッションを使用して実現しています。
ログイン認証に成功したらセッションにユーザの情報を登録し、それ以降のリクエスト時にはセッションからログインしているユーザの情報を取得します。
HTMLのフォームからユーザIDとパスワードを送信し、セッションに登録するサンプルです。
login.html
login.php
ユーザIDとパスワードを入力してログインボタンを押すと、フォームの送信先であるlogin.phpにデータが送信され、login.phpでは、ユーザIDが「$_SESSION[$userId]」、パスワードが「$_SESSION[$passwd]」で取得することができます。
ログイン画面
このサンプルでは、初めてのアクセス時に「$_SESSION[$userId] = $userId;」で、セッションにユーザIDを登録します。
ログイン後画面
同じセッションの次回のアクセスでは「$_SESSION[$userId]」が登録されているので、ログイン済みなことがわかります
セッション情報をデータベースで管理する方法
通常、セッション情報はWebサーバにファイルとして保存されますが、これをデータベースに保存することもできます。
データベースで管理することの利点
負荷分散を考え、Webシステムを複数のWebサーバで構築した場合、セッション情報を各Webサーバのファイルに保存してしまうと、接続するWebサーバが変わるごとにセッション情報が取得できなくなってしまいます。
複数のWebサーバで共通のデータベースサーバを持ち、そのデータベースでセッション情報を管理することで、接続するWebサーバが変わってもセッション情報を引き継ぐことができます。
セッション情報をデータベースに保存するメリットはそれだけでは有りません。その他にも、
・セッション情報を可視化できる
・セッション処理の負荷分散ができる
といったメリットが有ります。大規模なサーバーを構築したい方はぜひ以下の方法をマスターしてみてください!
処理の概要
セッション情報をデータベースで管理するには、セッションIDとセッションデータを格納するテーブルを作成し、session_set_save_handler関数に、SessionHandlerInterfaceインタフェースを実装したクラスのオブジェクトを渡します。
SessionHandlerInterfaceを実装するには、以下の6つのメソッドを実装します。
1. public bool close()
セッション終了時に呼び出される。
2. public bool destroy($セッションID)
セッション破棄時に呼び出される。
3. public bool gc($セッション存続期間)
セッションがメモリから削除される時に呼び出される。
4. public bool open($セッションデータ保存パス, $セッション保存名)
セッション開始時に呼び出される。
5. public string read($セッションID)
セッションデータ読み込み時に呼び出される。
6. public bool write($セッションID, $セッションデータをシリアライズした文字列)
セッションデータ書き込み時に呼び出される。
サンプルコード
以下に、セッション情報をデータベースで管理するサンプルを示します。
まず、以下のようなテーブルをデータベースに作成します。
SESSION_IDにはセッションID、SESSION_DATAにはセッションデータをシリアライズした文字列、CREATE_DATEには最終更新日時が入ります。
次に、SessionHandlerInterfaceの実装クラスを作成し、session_set_save_handlerに設定します。
セッションデータ書き込み時に呼び出されるwriteメソッドで、指定されたセッションIDのデータがなければINSERT、あればUPDATEをします。
セッションデータ読み込み時に呼び出されるreadメソッドで、指定されたセッションIDのデータをSELECTして返します。
セッション破棄時に呼び出されるdestroyメソッドで、指定されたセッションIDのデータをDELETEします。
このMySessionHandlerクラスを「session_set_save_handler(new MySessionHandler(), true);」でsession_set_save_handler関数に渡します。
その後、「session_start();」でセッションを開始し、「$_SESSION[‘data’] = 0;」でセッションに変数を登録しています。
これを実行すると、TBL_SESSIONテーブルに以下のようなデータが登録されます。
セッション情報をデータベースで管理することができました。
まとめ
今回はセッションの使い方について解説しました。
WEBシステムにおいて、ユーザごとの情報を保持し続けることのできるセッションは非常に重要です。
セッションの使い方を忘れてしまったら、この記事を思い出して下さい!
なお、他の言語やフレームワークでも同じようなセッション管理を行っています。
興味のある方は以下の記事も参考にしてみてください。
33歳、未経験だった僕がフリーエンジニアになれた理由
現在フリーでWEBエンジニアをやられている濱口直行さん。33歳で、プログラミングを学び始め、約半年という短い期間で独立までされた学習ログを余すことなくインタビューさせていただきました。プログラミングを学習中の方はもちろん、独立をお考えの方まで幅広く活用できる記事になっています。この機会に是非活用していただければと思います。
最短でプログラミングを習得したい方へ
元々ITリテラシーのある方やプログラムの学び方がわかっている方は独学で習得することも可能でしょう。
ただし、実際の学習期間中はつまづいている時間がほとんどです。
「もう挫折したくない」
「本業と両立しながら、好きな時間で自分のペースで勉強を続けていきたい。」
「自分だけのカリキュラムで効率的に勉強したい」
そんな方はお気軽に侍エンジニア塾までご相談ください。
弊社では、
- プログラミング基礎学習
- オリジナルアプリ開発
- 仕事獲得
までをひと通り学習できます。
まずは無料体験レッスンで、弊社のコンサルタントと一緒にあなた専用の学習方法やカリキュラムを考えてみませんか?
挫折しない学び方や、通常1000時間以上かかる学習時間を1/3にする方法などより具体的なアドバイスもさせていただいています。
詳しくは下の画像をクリックして弊社サービス内容をご確認ください。
学習者インタビュー
人気講師インタビュー
人気記事セレクション
プログラミング学習者必見
専属講師に質問し放題、レッスンし放題!最短1ヶ月でフリーランスエンジニアプログラミング学習カリキュラム無料公開中
Ruby学習カリキュラム無料公開中
Python学習カリキュラム無料公開中
1記事最大11,000円!テックライター募集