<?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.examples.basic.php',
    1 => '基本用法',
    2 => '基本用法',
  ),
  'up' => 
  array (
    0 => 'session.examples.php',
    1 => '示例',
  ),
  'prev' => 
  array (
    0 => 'session.examples.php',
    1 => '示例',
  ),
  'next' => 
  array (
    0 => 'session.idpassing.php',
    1 => '传送会话ID',
  ),
  '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.examples.basic" class="section">
  <h2 class="title">基本用法</h2>
   <p class="para">
    通过为每个独立用户分配唯一的会话 ID，可以实现针对不同用户分别存储数据的功能。
    会话通常被用来在多个页面请求之间保存及共享信息。
    一般来说，会话 ID 通过 cookie 的方式发送到浏览器，并且在服务器端也是通过会话 ID 来取回会话中的数据。
    如果请求中不包含会话 ID 信息，那么 PHP 就会创建一个新的会话，并为新创建的会话分配新的 ID。
   </p>
   <p class="para">
    会话的工作流程很简单。当开始一个会话时，PHP 会尝试从请求中查找会话 ID （通常通过会话 cookie），
    如果请求中不包含会话 ID 信息，PHP 就会创建一个新的会话。
    会话开始之后，PHP 就会将会话中的数据设置到 <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> 变量中。
    当 PHP 停止的时候，它会自动读取 <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> 中的内容，并将其进行序列化，
    然后发送给会话保存处理程序来进行保存。
   </p>
   <p class="para">
    默认情况下，PHP 使用内置的文件会话保存处理程序（<code class="parameter">files</code>）来完成会话的保存。
    也可以通过配置项 <a href="session.configuration.php#ini.session.save-handler" class="link">session.save_handler</a> 来修改所要采用的会话保存处理程序。
    对于文件会话保存处理程序，会将会话数据保存到配置项
    <a href="session.configuration.php#ini.session.save-path" class="link">session.save_path</a> 所指定的位置。
   </p>
   <p class="para">
    可以通过调用函数 <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span> 来手动开始一个会话。
    如果配置项 <a href="session.configuration.php#ini.session.auto-start" class="link">session.auto_start</a> 设置为<code class="parameter">1</code>，
    那么请求开始的时候，会话会自动开始。
   </p>
   <p class="para">
    PHP 脚本执行完毕之后，会话会自动关闭。
    同时，也可以通过调用函数 <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> 来手动关闭会话。
   </p>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>示例 #1 
     在 <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> 中注册变量。
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />session_start</span><span style="color: #007700">();<br />if (!isset(</span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">])) {<br />  </span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">] = </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />} else {<br />  </span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">]++;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <div class="example" id="example-2">
    <p><strong>示例 #2 
     从 <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> 中反注册变量。
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />session_start</span><span style="color: #007700">();<br />unset(</span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <p class="para">
   <div class="caution"><strong class="caution">警告</strong>
    <p class="para">
     千万不要使用 <code class="literal">unset($_SESSION)</code> 来复位超级变量 <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>，
     因为这样会导致无法继续在 <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> 
     中注册会话变量。
    </p>
   </div>
  </p>
  <div class="warning"><strong class="warning">警告</strong>
   <p class="para">
    由于无法将一个引用恢复到另外一个变量，
    所以不可以将引用保存到会话变量中。
   </p>
  </div>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    无论是通过调用函数 <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span> 手动开启会话，
    还是使用配置项 <a href="session.configuration.php#ini.session.auto-start" class="link">session.auto_start</a> 自动开启会话，
    对于基于文件的会话数据保存（PHP 的默认行为）而言，
    在会话开始的时候都会给会话数据文件加锁，
    直到 PHP 脚本执行完毕或者显式调用 <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> 来保存会话数据。
    在此期间，其他脚本不可以访问同一个会话数据文件。
   </p>
   <p class="para">
    对于大量使用 Ajax 或者并发请求的网站而言，这可能是一个严重的问题。
    解决这个问题最简单的做法是如果修改了会话中的变量，
    那么应该尽快调用 <span class="function"><a href="function.session-write-close.php" class="function">session_write_close()</a></span> 来保存会话数据并释放文件锁。
    还有一种选择就是使用支持并发操作的会话保存处理程序来替代文件会话保存处理程序。
   </p>
  </p></blockquote>
 </div><?php manual_footer($setup); ?>