PHPにおけるセッションとCookieは、データベースなどを使わずにデータを簡易的に保持しておくための仕組みです。
Webアプリケーションを学ぶ上では避けては通れない部分だと思います。
この記事では、セッションとCookieの役割や違い、それぞれの使い方について、解説していきます。
目次
セッションとCookieの役割
そもそも何でデータを保持しておく必要があるのか?という点からお話しすると、普段Webサイトを閲覧する際に用いているHTTPという通信は、ステートレスな(状態を保持しない)通信なのです。
つまり、リクエストに対してレスポンスを返したらそれで通信は終わり。Webサイトとクライアント(ブラウザ)は常に繋がっている訳ではありません。
例えば、ブラウザで一度読み込んだページは、その後インターネットの接続を切ったとしてもしばらく見れたりしますよね。
でも、ログイン状態であったり、ショッピングサイトのカートの状態であったり、ページを離れたりしばらく放置しても保持している情報はたくさんあります。
そういった情報の保持を可能にしているのが、セッションとCookie(クッキー)という仕組みです。
セッションとCookieの違い
上にも書いたように、どちらもデータを保持するための仕組みです。
では何が違うのかというと、
- セッションはサーバー側に保存される情報
- Cookieはクライアント側(ブラウザ)に保存される情報
です。詳細は以下に記載します。
セッションとは?
セッションはサーバー側に保存される情報で、その用途は様々です。
ログイン状態であったり、カートの商品であったり、検索条件であったり、ページを跨いで保持しておきたい情報を保存します。
セッションのデータはファイルとしてサーバーに保存されます。サーバーに保存される情報ですので、javascriptなどのクライアント側で動作するスクリプトからはアクセスできません。
また、有効期限や最大サイズの制限があり、それらはサーバー側で任意に設定します。
Cookieとは?
Cookieはクライアント側(ブラウザ)に保存される情報で、キー=値という形式の文字列情報です。そのため、それほど大きなデータは扱えません。
Cookieに保存された情報は、HTTPヘッダに乗せてサーバーに送信されます。したがって、javascriptからもPHPからもアクセス可能です。
代表的な用途としては、サーバーに保存されているセッションが「どのユーザーのものなのか」を識別するために、Cookieを使います。
どういうことかというと、セッションはサーバーに保存されている情報だと上で説明したと思います。でも、サーバーは一つだけであり、そこにたくさんのユーザーがアクセスします。
つまり、セッションはユーザー毎に別々に保存しておく必要があり、次回アクセスした際に、ユーザーとセッションを紐付ける情報が必要です。
その紐付けをするための情報が、セッションIDと呼ばれるIDで、サーバー側では大抵はこのセッションIDをファイル名としたファイルにセッション情報が保存されています。
そして同じセッションIDをブラウザのCookieに保存しておくことで、次回アクセス時にセッションIDを送信し、自分のセッション情報を取得できるという訳です。
PHPにおけるセッションの使い方
次に、PHPでのセッションの具体的な使い方について解説します。
セッションを使うには、初めにsession_start()という関数を必ず呼び出す必要があります。
これを呼び出すことによって、初回アクセス時には新規セッションの作成、2回目以降のアクセス時にはCookieで送信されたセッションIDを元にセッションの復元を行います。
// セッションの開始
session_start();
セッションの保存や参照は、非常に簡単です。セッションは$_SESSIONというグローバル変数として使えますので、連想配列の変数を使う要領で、セッションを扱うことができます。
// セッションの開始
session_start();
// セッションの初期化
if(!$_SESSION['count']){
$_SESSION['count'] = 0;
}
// セッションの出力
echo $_SESSION['count'];
// セッションの更新
$_SESSION['count'] = $_SESSION['count'] + 1;
上記のようなスクリプトを作成して、ブラウザから何度かアクセスしてみると、アクセスの度にセッションが更新されていることが確認できると思います。
PHPにおけるCookieの使い方
Cookieは、セッションと同様に$_COOKIEというグローバル変数で参照できますが、保存方法が少々異なります。
Cookieを保存するには、setcookie()という関数を使用します。
// Cookieの保存
setcookie('cookiename', 'test', time() + 3600);
// Cookieの参照
echo $_COOKIE['cookiename'];
setcookie関数は、第1引数が名前、第2引数が値、第3引数が有効期限です。
有効期限にはUnixタイムスタンプを設定します。上記の例の場合、3600秒後(1時間後)が有効期限になります。
有効期限を省略した場合は、ブラウザを閉じるまで有効です。
ちなみにCookieを即時破棄したい場合は、setcookieに過去の時刻を指定します。
// Cookieの破棄
setcookie('cookiename', 'test', time() - 1);
まとめ
概要をまとめます。
- セッションはサーバー側に保存する情報
- Cookieはクライアント側(ブラウザ)に保存する情報
- Cookieに保存されているセッションIDを元にセッションを復元する
セッションはPHPを始めたばかりの人が躓きがちな部分かと思いますが、使いこなせれば非常に便利な機能です。
是非習得しておきましょう。