English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、PHPのセッションを使用してデータを一時的にサーバー上に保存する方法を学びます。
Cookieを使用してデータを保存することはできますが、いくつかのセキュリティ問題があります。cookieはユーザーのコンピュータ上に保存されるため、攻撃者はcookieの内容を簡単に変更し、有害なデータをアプリケーションに挿入することができます。これにより、アプリケーションが破壊される可能性があります。
また、ブラウザがサーバーにURLをリクエストするたびに、ウェブサイトのすべてのcookieデータがリクエストに自動的に送信されます。これは、ユーザーのシステムにcookieを保存している場合、すべてのcookieデータがリクエストに含まれることを意味します。5個のCookieがあり、各Cookieのサイズが4KBのデータがある場合、ブラウザはユーザーがページを確認するたびにデータをアップロードする必要があります。20KBのデータで、これによりサイトのパフォーマンスに影響を与える可能性があります。
PHPのsessionを使用して、これらの問題を解決できます。PHPのsessionはデータをユーザーのコンピュータではなくサーバー上に保存します。セッション環境では、各ユーザーはセッション識別子(SID)と呼ばれるユニークな番号で識別されます。このユニークなセッションIDは、各ユーザーがサーバー上に保存する情報(例えば、メールアドレス、投稿など)とリンクされます。
ヒント:セッションIDはPHPエンジンがランダムに生成するため、推測することがほぼ不可能です。また、セッションデータはサーバー上に保存されるため、ブラウザの各リクエストに合わせて送信する必要はありません。
会話変数に情報を保存する前に、まずセッションを開始する必要があります。新しいセッションを開始するには、PHPのsession_start()関数を呼び出すだけで良いです。これにより、新しいセッションが作成され、ユーザーにユニークなセッションIDが生成されます。
以下のPHPコード例は、新しいセッションを開始するためのものです。
<?php //sessionを開始する session_start(); ?>
session_start()関数はまず、会話IDの存在を確認して、会話が既に存在するかどうかをチェックします。既存の会話が見つかった場合、会話が既に開始されていると判断し、会話変数を設定します。見つからない場合、新しい会話IDを作成して新しい会話を開始します。
注意:ページの先頭(ブラウザでスクリプトが生成する出力の前に)でsession_start()関数を呼び出す必要があります。setcookie()関数でcookieを設定する際と同様です。
すべてのセッションデータをキーペアとして$_SESSION[]超全機能配列に保存できます。セッションの生存期間中に保存されたデータにアクセスできます。以下のスクリプトを見てください。このスクリプトは新しいセッションを作成し、2つのセッション変数を登録します。
<?php //セッションを開始中 session_start(); //セッションデータを保存 $_SESSION["firstname"] = "Peter"; $_SESSION["lastname"] = "Parker"; ?>
前の例で同じWebドメインの他のページから設定したセッションデータにアクセスするには、session_start()を呼び出してセッションを再作成し、対応するキーを$_SESSION連想配列に渡すだけで十分です。
<?php //セッションを開始中 session_start(); //セッションデータにアクセス echo 'Hi, ' . $_SESSION["firstname"] . ' ' . $_SESSION["lastname"]; ?>
上記のPHPコードは以下のような出力を生成します。
Hi, Peter Parker
注意:同じページにアクセスする場合のセッションデータにアクセスするには、セッションを再作成する必要はありません。なぜなら、それがページの上部で既に開始されているからです。
特定のセッションデータを削除するには、以下の例のように$_SESSION連想配列の対応するキーを設定解除するだけで十分です:
<?php //セッションを開始 session_start(); //セッションデータを削除中 if(isset($_SESSION["lastname"])){ unset($_SESSION["lastname"]); } ?>
しかし、完全にセッションを破棄するには、session_destroy()関数を呼び出すだけで十分です。この関数は任何の引数を必要とせず、一度呼び出すだけですべてのセッションデータが破棄されます。
<?php //セッションを開始 session_start(); //セッションを破棄 session_destroy(); ?>
注意:session_destroy()関数を使用してセッションを破棄する前に、セッション環境がまだ存在していない場合、まずsession_start()関数を使用してセッション環境を再作成する必要があります。
それぞれのPHPセッションにはタイムアウト値(秒単位で指定される持续时间)があり、この値はユーザー活動が無い状態でセッションがアクティブ状態を維持する時間を決定します。このタイムアウト時間を調整するには、PHP設定ファイル(php.ini)のsession.gc_maxlifetime変数の値を変更してください。