<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.session.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'function.session-set-save-handler.php',
    1 => 'session_set_save_handler',
    2 => 'ユーザー定義のセッション保存関数を設定する',
  ),
  'up' => 
  array (
    0 => 'ref.session.php',
    1 => 'セッション関数',
  ),
  'prev' => 
  array (
    0 => 'function.session-set-cookie-params.php',
    1 => 'session_set_cookie_params',
  ),
  'next' => 
  array (
    0 => 'function.session-start.php',
    1 => 'session_start',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'reference/session/functions/session-set-save-handler.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.session-set-save-handler" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">session_set_save_handler</h1>
  <p class="verinfo">(PHP 4, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">session_set_save_handler</span> &mdash; <span class="dc-title">ユーザー定義のセッション保存関数を設定する</span></p>

 </div>
 <div class="refsect1 description" id="refsect1-function.session-set-save-handler-description">
  <h3 class="title">説明</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>session_set_save_handler</strong></span>(<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$open</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$close</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$read</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$write</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$destroy</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$gc</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$create_sid</code><span class="initializer"> = ?</span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$validate_sid</code><span class="initializer"> = ?</span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> <code class="parameter">$update_timestamp</code><span class="initializer"> = ?</span></span><br>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

  <p class="para rdfs-comment">
   次のプロトタイプでも登録できます。
  </p>
  <div class="methodsynopsis dc-description"><span class="methodname"><strong>session_set_save_handler</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.object.php" class="type object">object</a></span> <code class="parameter">$sessionhandler</code></span>, <span class="methodparam"><span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> <code class="parameter">$register_shutdown</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></span></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

  <p class="para rdfs-comment">
   <span class="function"><strong>session_set_save_handler()</strong></span> は、セッションに
   関連するデータを保存および取得するために使用されるユーザー定義の
   セッション保存関数を設定します。この関数は、PHP セッションにより
   提供されるもの以外の保存方法を使用したい場合に有用です。
   例えば、セッションデータをローカルデータベースに保存します。
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.session-set-save-handler-parameters">
  <h3 class="title">パラメータ</h3>
  <p class="para">
   この関数には二種類のプロトタイプがあります。
   <dl>
    
     <dt><code class="parameter">sessionhandler</code></dt>
     <dd>
      <p class="para">
       <span class="interfacename"><a href="class.sessionhandlerinterface.php" class="interfacename">SessionHandlerInterface</a></span>、
       <span class="interfacename"><a href="class.sessionidinterface.php" class="interfacename">SessionIdInterface</a></span>(オプション)
       または
       <span class="interfacename"><a href="class.sessionupdatetimestamphandlerinterface.php" class="interfacename">SessionUpdateTimestampHandlerInterface</a></span>
        を実装したクラス、たとえば
       <span class="classname"><a href="class.sessionhandler.php" class="classname">SessionHandler</a></span> のインスタンスで、
       これをセッションハンドラとして登録する。
      </p>
     </dd>
    
    
     <dt><code class="parameter">register_shutdown</code></dt>
     <dd>
      <p class="para">
       <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> を
       <span class="function"><a href="function.register-shutdown-function.php" class="function">register_shutdown_function()</a></span> 関数として登録するかどうか。
      </p>
     </dd>
    
   </dl>

   あるいは

   <dl>
    
     <dt><code class="parameter">open</code></dt>
     <dd>
      <p class="para">
       以下のシグネチャを持つ callable:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">open</span></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$savePath</code></span>, <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$sessionName</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       open コールバックはクラスのコンストラクタのようなもので、セッションを開くときに実行されます。
       セッションが自動で開始したり、あるいは手動で <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span>
       で開始させたりするときに、最初に実行されるコールバック関数がこれです。
       成功した場合は <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>、失敗した場合は <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> を返します。
      </p>
     </dd>
    
    
     <dt><code class="parameter">close</code></dt>
     <dd>
      <p class="para">
       以下のシグネチャを持つ callable:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">close</span></span>(): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       close コールバックはクラスのデストラクタのようなもので、write コールバックがコールされた後で実行されます。
       また、<span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> がコールされたときにも実行されます。
       成功した場合は <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>、失敗した場合は <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> を返します。
      </p>
     </dd>
    
    
     <dt><code class="parameter">read</code></dt>
     <dd>
      <p class="para">
       以下のシグネチャを持つ callable:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">read</span></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$sessionId</code></span>): <span class="type"><a href="language.types.string.php" class="type string">string</a></span></div>

      </p>
      <p class="para">
       <code class="parameter">read</code> コールバックは、常にセッションエンコード (シリアライズ)
       された文字列を返さなければなりません。何もデータを読み込まなかった場合は空文字列を返します。
      </p>
      <p class="para">
       このコールバックは、セッションが開始したときや
       <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span> がコールされたときに PHP が内部的に実行します。
       このコールバックを実行する前に、PHP は
       <code class="parameter">open</code> コールバックを実行します。
      </p>
      <p class="para">
       このコールバックが返す値は、
       <code class="parameter">write</code> コールバックがストレージに渡した形式とまったく同じシリアライズ形式でなければなりません。
       返された値を PHP が自動的にアンシリアライズして、スーパーグローバル <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>
       に格納します。データの形式は <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span> したものと似ていますが、実際は違う形式であることに注意しましょう。
       シリアライズの方法は ini 設定 <a href="session.configuration.php#ini.session.serialize-handler" class="link">session.serialize_handler</a> で指定します。
      </p>
     </dd>
    
    
     <dt><code class="parameter">write</code></dt>
     <dd>
      <p class="para">
       以下のシグネチャを持つ callable:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">write</span></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$sessionId</code></span>, <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$data</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       <code class="parameter">write</code> コールバックは、セッションの保存や終了が必要となったときにコールされます。
       このコールバックが受け取るのは、現在のセッション ID とシリアライズ後のスーパーグローバル <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> です。
       PHP が内部で利用するシリアライズ方法は、ini 設定
       <a href="session.configuration.php#ini.session.serialize-handler" class="link">session.serialize_handler</a> で指定します。
      </p>
      <p class="para">
       このコールバックに渡されたシリアライズ後のセッションデータを、
       渡されたセッション ID に対応させて格納しなければなりません。
       このデータを取得した <code class="parameter">read</code> コールバックは、
       <code class="parameter">write</code> コールバックに最初に渡されたのとまったく同じ値を返さなければなりません。
      </p>
      <p class="para">
       このコールバックが実行されるのは、PHP のスクリプトが終了するときか、あるいは明示的に <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span>
       がコールされたときです。この関数の実行後には、PHP が内部的に <code class="parameter">close</code>
       コールバックを実行することに注意しましょう。
       <blockquote class="note"><p><strong class="note">注意</strong>: 
        <p class="para">
         &quot;write&quot; ハンドラは、出力ストリームが閉じてから実行されます。
         したがって、&quot;write&quot; ハンドラ内でデバッグ出力を行っても、
         それはブラウザに表示されません。
         デバッグ出力が必要なら、それをファイルに書き出すようにしましょう。
        </p>
       </p></blockquote>
      </p>
     </dd>
    
    
     <dt><code class="parameter">destroy</code></dt>
     <dd>
      <p class="para">
       以下のシグネチャを持つ callable:
       <div class="methodsynopsis dc-description">
        <span class="methodname"><span class="replaceable">destroy</span></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$sessionId</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       このコールバックが実行されるのは、
       <span class="function"><a href="function.session-destroy.php" class="function">session_destroy()</a></span> あるいは
       <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> (destroy パラメータを <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> にした場合)
       を実行し、セッションを破棄した場合です。
       成功した場合は <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>、失敗した場合は <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> を返します。
      </p>
     </dd>
    
    
     <dt><code class="parameter">gc</code></dt>
     <dd>
      <p class="para">
       以下のシグネチャを持つ callable:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">gc</span></span>(<span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$lifetime</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       ガベージコレクタコールバックは PHP が内部で定期的に実行し、古いセッションデータを破棄します。
       実行頻度は <a href="session.configuration.php#ini.session.gc-probability" class="link">session.gc_probability</a>
       および <a href="session.configuration.php#ini.session.gc-divisor" class="link">session.gc_divisor</a> で設定します。
       この関数に渡される有効期限の値は <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a>
       で設定できます。
       成功した場合は <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>、失敗した場合は <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> を返します。
      </p>
     </dd>
    
    
     <dt><code class="parameter">create_sid</code></dt>
     <dd>
      <p class="para">
       以下のシグネチャを持つ callable:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">create_sid</span></span>(): <span class="type"><a href="language.types.string.php" class="type string">string</a></span></div>

      </p>
      <p class="para">
       このコールバックは、新しいセッション ID が必要になったときに実行されます。
       パラメータは不要です。戻り値は、使っているハンドラで有効なセッション ID を表す文字列となります。
      </p>
     </dd>
    
    
     <dt><code class="parameter">validate_sid</code></dt>
     <dd>
      <p class="para">
       以下のシグネチャを持つ callable:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">validate_sid</span></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$key</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       このコールバックは、セッションが開始された場合に実行されます。
       但し、セッションID が渡され、
       <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a> 
       が有効な場合に限ります。
       <code class="parameter">key</code> は検証する セッションID を指定します。
       渡されたID のセッションが既に存在する場合、セッションID は有効です。
       成功した場合は <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>、失敗した場合は <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> を返します。
      </p>
     </dd>
    
    
     <dt><code class="parameter">update_timestamp</code></dt>
     <dd>
      <p class="para">
       以下のシグネチャを持つ callable:
       <div class="methodsynopsis dc-description"><span class="methodname"><span class="replaceable">update_timestamp</span></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$key</code></span>, <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$val</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

      </p>
      <p class="para">
       このコールバックは、セッションが更新された時に実行されます。
       <code class="parameter">key</code> はセッションID、
       <code class="parameter">val</code> はセッションデータを指定します。
       成功した場合は <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>、失敗した場合は <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> を返します。
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.session-set-save-handler-returnvalues">
  <h3 class="title">戻り値</h3>
  <p class="para">
   成功した場合に <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> を、失敗した場合に <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> を返します。
  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-function.session-set-save-handler-examples">
  <h3 class="title">例</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>例1 
     自作のセッションハンドラ: 完全なコードは <span class="classname"><a href="class.sessionhandlerinterface.php" class="classname">SessionHandlerInterface</a></span> を参照
    </strong></p>
    <div class="example-contents"><p>
     ここでは実行するところだけを示します。完全な例は、上でリンクしている
     <span class="classname"><a href="class.sessionhandlerinterface.php" class="classname">SessionHandlerInterface</a></span> のページを参照ください。
    </p></div>
    <div class="example-contents"><p>
     <span class="function"><strong>session_set_save_handler()</strong></span> でオブジェクト指向型のプロトタイプを使っていることと、
     シャットダウン関数をその parameter フラグで登録していることに注目しましょう。
     オブジェクトをセッション保存ハンドラとして使うときには、この方法をおすすめします。
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MySessionHandler </span><span style="color: #007700">implements </span><span style="color: #0000BB">SessionHandlerInterface<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// ここでインターフェイスを実装します<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">$handler </span><span style="color: #007700">= new </span><span style="color: #0000BB">MySessionHandler</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">session_set_save_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$handler</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">session_start</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// $_SESSION への値の設定や格納されている値の取得を進めます</span></span></code></div>
    </div>

   </div>
  </p>
 </div>


 <div class="refsect1 notes" id="refsect1-function.session-set-save-handler-notes">
  <h3 class="title">注意</h3>
  <div class="warning"><strong class="warning">警告</strong>
   <p class="para">
    <code class="parameter">write</code> ハンドラおよび
    <code class="parameter">close</code> ハンドラはオブジェクトが破棄されたあとにコールされます。
    そのため、これらのハンドラでオブジェクトを使ったり例外をスローしたりすることはできません。
    例外をキャッチできないのでその情報をトレースすることもできず、
    例外は単純に無視されてしまいます。
    しかし、オブジェクトのデストラクタではセッションを使えます。
   </p>
   <p class="para">
    この「ニワトリが先かタマゴが先か」の問題を解決するために、
    デストラクタから <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span>
    をコールできますが、より確実なのは先述のとおりシャットダウン関数を登録することです。
   </p>
  </div>
  <div class="warning"><strong class="warning">警告</strong>
   <p class="para">
    SAPI の種類によっては、スクリプトの終了時にセッションを閉じると
    現在の作業ディレクトリが変わってしまうことがあります。これを防ぐには、
    事前に <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> でセッションを閉じます。
   </p>
  </div>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.session-set-save-handler-seealso">
  <h3 class="title">参考</h3>
  <p class="para">
   <ul class="simplelist">
    <li>
     設定ディレクティブ <a href="session.configuration.php#ini.session.save-handler" class="link">session.save_handler</a>
    </li>
    <li>
     設定ディレクティブ <a href="session.configuration.php#ini.session.serialize-handler" class="link">session.serialize_handler</a>
    </li>
    <li><span class="function"><a href="function.register-shutdown-function.php" class="function" rel="rdfs-seeAlso">register_shutdown_function()</a> - シャットダウン時に実行する関数を登録する</span></li>
    <li><span class="function"><a href="function.session-register-shutdown.php" class="function" rel="rdfs-seeAlso">session_register_shutdown()</a> - セッションのシャットダウン関数</span></li>
    <li>
     手続き型の完全なリファレンス実装は
     <a href="https://github.com/php/php-src/blob/master/ext/session/tests/save_handler.inc" class="link external">&raquo;&nbsp;save_handler.inc</a> を参照ください。
    </li>
   </ul>
  </p>
 </div>


</div><?php manual_footer($setup); ?>