&reftitle.examples;
基本的な使用法 セッションは、シンプルな方法で個々のユーザーのデータを格納する仕組みで、 個々のユーザーに対して一意なセッション ID を用意します。 これを用いて、複数ページにまたがるリクエストの間で状態の情報を永続させることができます。 セッション ID をブラウザに送信するときには、通常はセッションクッキーを利用します。 また、その ID を使って既存のセッションデータを取得します。 その ID やセッションクッキーが存在しなければ PHP に対して新たなセッションを作るよう伝え、 新たなセッション ID を生成します。 セッションの処理の流れは単純です。セッションを開始すると、 PHP はまず、(通常はセッションクッキーから受け取る) ID を使って既存のセッションを取得しようとします。 ID を受け取らなかった場合は新しいセッションを作成します。 セッションを開始すると、PHP はスーパーグローバル $_SESSION にすべてのセッションデータを格納します。PHP スクリプトの処理が終了するときには、 スーパーグローバル $_SESSION の中身を自動的に受け取ってシリアライズし、 ストレージに送信します。この一連の操作にはセッション保存ハンドラを使います。 デフォルトでは、PHP が使う保存ハンドラは files です。これは session.save_handler で設定します。 このハンドラは、サーバー上の session.save_path で指定した場所にセッションデータを保存します。 セッションを手動で開始するには session_start 関数を使います。 session.auto_start に 1 を設定している場合は、 リクエストの開始時に自動的にセッションを開始します。 通常は、PHP がスクリプトの処理を終了するときに、セッションは自動的に終了します。 手動でセッションを終了させるには session_write_close 関数を使います。 <varname>$_SESSION</varname>で変数を登録 ]]> 変数を <varname>$_SESSION</varname> から削除する ]]> unset($_SESSION)によって 全ての$_SESSIONを初期化してはいけません。 $_SESSIONスーパーグローバル変数を用いた セッション変数の登録ができなくなってしまうからです。 セッション変数において参照を使用することはできません。 他の変数への参照を復元する方法がないからです。 ファイルベースのセッション (PHP のデフォルト) は、 session_start でオープンしたり session.auto_start で暗黙のうちに開始したりしたセッションのセッションファイルをロックします。 いったんロックがかかったら、そのスクリプトが終了するなり session_write_close を呼んでセッションを閉じるなりしない限り、 他のスクリプトからはそのセッションファイルにアクセスできません。 これは、たとえば AJAX を使いまくっていて同時に複数のリクエストが発生したりするウェブサイトで問題になります。 この問題への対処方法として一番お手軽なのは、セッションに対して必要な変更が終わったらすぐに session_write_close を呼ぶことです。スクリプトの最初のほうで呼ぶほうが好ましいでしょう。 あるいは、ファイルではなく別のバックエンド (同時アクセスに対応しているもの) を使うという手もあります。
セッションIDの受渡し セッションIDの通知を行うためには次の二つの方法があります。 Cookies URLパラメータ sessionモジュールは、両方の方法をサポートします。 Cookieは最適ですが、(クライアントがCookieを受け入れない可能性が あるため)信頼性がなく、これに依存することができません。2番目の方 法は、セッションIDを直接URLに埋め込みます。 PHPには、透過的にリンクを変換する機能を有しています。 この実行時オプション session.use_trans_sidが有効な場合、 相対URIは自動的にセッションIDを含むように変換されます。 arg_separator.output &php.ini; ディレクティブにより、引数セパレータをカスタマイズする ことができます。XHTMLに完全準拠するためには、ここに &amp; を指定してください。 もしくは、セッションが開始している場合に定義されている定数 SID を使用することもできます。クライアントが適当な セッションクッキーを送信しなかった場合、この定数は session_name=session_id の形式となります。 他方、送信された場合には、この定数は空の文字列に展開されます。 このため、この定数を無条件に URL に埋め込むことができます。 次の例は、変数の登録法および SID を用いて他のページに正しくリンクする方法のデモです。 単一のユーザーに関するヒット数を数える

こんにちは、あなたがこのページに来たのは 回目ですね。

続けるには、ここをクリック してください。

]]>
XSSに関係する攻撃を防止するためにSIDを出力する際に、 htmlspecialcharsを使用します。 PHPをコンパイルする際に --enable-trans-sid を使用した場合、 上の例のように SID を出力する必要はありません。 相対URLでないURLは外部サイトを指していると仮定され、SID が追加されません。これは、SID を外部のサーバーに開示することはセキュリティ上のリスクとなる可能性があるためです。
カスタムセッションハンドラ セッション情報をデータベースに保存する機能か他の保存法を実装するには、 一連のユーザーレベルの保存関数を作成し、 session_set_save_handlerを使用する必要があります。 SessionHandlerInterface を使ったり、SessionHandler を継承して PHP の内部セッションハンドラを拡張したりしてセッションハンドラを作成できます。 session_set_save_handler で指定したコールバックメソッドが、 セッションのライフサイクル内で PHP からコールされます。 セッションの openreadwriteclose、そしてセッションの削除 (destroy) や定期的なガベージコレクション (gc) などのときです。 したがって、PHP では常にセッション保存ハンドラが必要となります。デフォルトは、通常はファイルベースの保存ハンドラです。 自作の保存ハンドラは session_set_save_handler で設定できます。 内部的な保存ハンドラとして、デフォルト以外のものも PHP の拡張モジュールとして用意されています。 sqlitememcache そして memcached などで、これらは session.save_handler で設定できます。 セッションが開始するときに、PHP は内部的に open ハンドラをコールします。 それに続けて read コールバックを実行し、 このコールバックがエンコードされた文字列を返します。これは最初にセッションストレージに渡されたものと同じ形式になります。 read コールバックがエンコードした文字列を返したら、 PHP がそれをデコードしてデコード後の配列をスーパーグローバル $_SESSION に格納します。 PHP のスクリプトが終了するとき (あるいは session_write_close がコールされたとき) には、 PHP が内部的にスーパーグローバル $_SESSION をエンコードします。 そして、それをセッション ID とともに write コールバックに渡します。 write コールバックが終了すると、PHP は内部的に close コールバックハンドラを実行します。 セッションが明確に破棄されたときには、PHP は destroy ハンドラをセッション ID つきでコールします。 PHP はときどき gc コールバックを実行し、 設定されているセッション有効期限にもとづいて期限切れのセッションレコードを無効化します。 この処理では、最後にアクセスされてからの時間が $lifetime を超えているすべてのレコードを永続ストレージから削除しなければなりません。