<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/session.examples.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'session.customhandler.php',
    1 => 'カスタムセッションハンドラ',
    2 => 'カスタムセッションハンドラ',
  ),
  'up' => 
  array (
    0 => 'session.examples.php',
    1 => '例',
  ),
  'prev' => 
  array (
    0 => 'session.idpassing.php',
    1 => 'セッションIDの受渡し',
  ),
  'next' => 
  array (
    0 => 'session.upload-progress.php',
    1 => 'セッションのアップロード状況',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'reference/session/examples.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="session.customhandler" class="section">
  <h2 class="title">カスタムセッションハンドラ</h2>
  <p class="para">
   セッション情報をデータベースに保存する機能か他の保存法を実装するには、
   一連のユーザーレベルの保存関数を作成し、
   <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span>を使用する必要があります。
   <span class="classname"><a href="class.sessionhandlerinterface.php" class="classname">SessionHandlerInterface</a></span>
   を使ったり、<span class="classname"><a href="class.sessionhandler.php" class="classname">SessionHandler</a></span> を継承して
   PHP の内部セッションハンドラを拡張したりしてセッションハンドラを作成できます。
  </p>
  <p class="para">
   <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span> で指定したコールバックメソッドが、
   セッションのライフサイクル内で PHP からコールされます。
   セッションの <code class="parameter">open</code>、<code class="parameter">read</code>、<code class="parameter">write</code>、
   <code class="parameter">close</code>、そしてセッションの削除 (<code class="parameter">destroy</code>)
   や定期的なガベージコレクション (<code class="parameter">gc</code>) などのときです。
  </p>
  <p class="para">
   したがって、PHP では常にセッション保存ハンドラが必要となります。デフォルトは、通常はファイルベースの保存ハンドラです。
   自作の保存ハンドラは <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span> で設定できます。
   内部的な保存ハンドラとして、デフォルト以外のものも PHP の拡張モジュールとして用意されています。
   <code class="parameter">sqlite</code> や <code class="parameter">memcache</code> そして
   <code class="parameter">memcached</code> などで、これらは <a href="session.configuration.php#ini.session.save-handler" class="link">session.save_handler</a>
   で設定できます。
  </p>
  <p class="para">
   セッションが開始するときに、PHP は内部的に <code class="parameter">open</code> ハンドラをコールします。
   それに続けて <code class="parameter">read</code> コールバックを実行し、
   このコールバックがエンコードされた文字列を返します。これは最初にセッションストレージに渡されたものと同じ形式になります。
   <code class="parameter">read</code> コールバックがエンコードした文字列を返したら、
   PHP がそれをデコードしてデコード後の配列をスーパーグローバル
   <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> に格納します。
  </p>
  <p class="para">
   PHP のスクリプトが終了するとき (あるいは <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> がコールされたとき) には、
   PHP が内部的にスーパーグローバル <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> をエンコードします。
   そして、それをセッション ID とともに <code class="parameter">write</code> コールバックに渡します。
   <code class="parameter">write</code> コールバックが終了すると、PHP は内部的に
   <code class="parameter">close</code> コールバックハンドラを実行します。
  </p>
  <p class="para">
   セッションが明確に破棄されたときには、PHP は
   <code class="parameter">destroy</code> ハンドラをセッション ID つきでコールします。
  </p>
 <p class="para">
   PHP はときどき <code class="parameter">gc</code> コールバックを実行し、
   設定されているセッション有効期限にもとづいて期限切れのセッションレコードを無効化します。
   この処理では、最後にアクセスされてからの時間が <code class="parameter">$lifetime</code>
   を超えているすべてのレコードを永続ストレージから削除しなければなりません。
 </p>
 </div><?php manual_footer($setup); ?>