<?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 => 'zh',
  ),
  '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 => 'Session 上传进度',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    '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> 的参数即为在会话生命周期内要调用的一组回调函数：
   <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> 回调函数来读取内容，该回调函数返回已经经过编码的字符串。
   然后 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>  回调函数。
  </p>
 <p class="para">
  根据会话生命周期时间的设置，PHP 会不时地调用 <code class="parameter">gc</code> 回调函数。
  该函数会从持久化存储中删除超时的会话数据。
  超时是指会话最后一次访问时间距离当前时间超过了 <code class="parameter">$lifetime</code> 所指定的值。
 </p>
 </div><?php manual_footer($setup); ?>