uTools-Manuals/docs/php/session_start.html
2019-04-28 19:00:34 +08:00

253 lines
14 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>启动新会话或者重用现有会话</title>
</head>
<body class="docs"><div id="layout">
<div id="layout-content"><div id="function.session-start" class="refentry">
<div class="refnamediv">
<h1 class="refname">session_start</h1>
<p class="verinfo">(PHP 4, PHP 5, PHP 7)</p><p class="refpurpose"><span class="refname">session_start</span> &mdash; <span class="dc-title">启动新会话或者重用现有会话</span></p>
</div>
<div class="refsect1 description" id="refsect1-function.session-start-description">
<h3 class="title">说明</h3>
<div class="methodsynopsis dc-description">
<span class="methodname"><strong>session_start</strong></span>
([ <span class="methodparam"><span class="type">array</span> <code class="parameter">$options</code><span class="initializer"> = array()</span></span>
] ) : <span class="type">bool</span></div>
<p class="para rdfs-comment">
<span class="function"><strong>session_start()</strong></span> 会创建新会话或者重用现有会话。
如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID
则会重用现有会话。
</p>
<p class="para">
当会话自动开始或者通过 <span class="function"><strong>session_start()</strong></span> 手动开始的时候,
PHP 内部会调用会话管理器的 open 和 read 回调函数。
会话管理器可能是 PHP 默认的,
也可能是扩展提供的SQLite 或者 Memcached 扩展),
也可能是通过 <span class="function"><a href="session_set_save_handler.html" class="function">session_set_save_handler()</a></span> 设定的用户自定义会话管理器。
通过 read 回调函数返回的现有会话数据(使用特殊的序列化格式存储),
PHP 会自动反序列化数据并且填充 $_SESSION 超级全局变量。
</p>
<p class="para">
要想使用命名会话,请在调用 <span class="function"><strong>session_start()</strong></span> 函数
之前调用 <span class="function"><a href="session_name.html" class="function">session_name()</a></span> 函数。
</p>
<p class="para">
如果启用了 <a href="session.configuration.html#ini.session.use-trans-sid" class="link">session.use_trans_sid</a> 选项,
<span class="function"><strong>session_start()</strong></span> 函数会注册一个内部输出管理器,
该输出管理器完成 URL 重写的工作。
</p>
<p class="para">
如果用户联合使用 <span class="function"><a href="ob_start.html" class="function">ob_start()</a></span>
<em>ob_gzhandler</em> 函数,
那么函数的调用顺序会影响输出结果。
例如,必须在开始会话之前调用 <em>ob_gzhandler</em> 函数完成注册。
</p>
</div>
<div class="refsect1 parameters" id="refsect1-function.session-start-parameters">
<h3 class="title">参数</h3>
<dl>
<dt>
<code class="parameter">options</code></dt>
<dd>
<p class="para">
此参数是一个关联数组,如果提供,那么会用其中的项目覆盖 <a href="session.configuration.html" class="link">会话配置指示</a> 中的配置项。此数组中的键无需包含 <em>session.</em> 前缀。
</p>
<p class="para">
除了常规的会话配置指示项,
还可以在此数组中包含 <em>read_and_close</em>
选项。如果将此选项的值设置为 <strong><code>TRUE</code></strong>
那么会话文件会在读取完毕之后马上关闭,
因此,可以在会话数据没有变动的时候,避免不必要的文件锁。
</p>
</dd>
</dl>
</div>
<div class="refsect1 returnvalues" id="refsect1-function.session-start-returnvalues">
<h3 class="title">返回值</h3>
<p class="para">
成功开始会话返回 <strong><code>TRUE</code></strong> ,反之返回 <strong><code>FALSE</code></strong>
</p>
</div>
<div class="refsect1 changelog" id="refsect1-function.session-start-changelog">
<h3 class="title">更新日志</h3>
<p class="para">
<table class="doctable informaltable">
<thead>
<tr>
<th>版本</th>
<th>说明</th>
</tr>
</thead>
<tbody class="tbody">
<tr>
<td>7.1.0</td>
<td>
<span class="function"><strong>session_start()</strong></span> 执行失败,
无法开始一个会话的时候,会返回 <strong><code>FALSE</code></strong>
并且不会初始化超级变量 <var class="varname"><var class="varname"><a href="reserved.variables.session.html" class="classname">$_SESSION</a></var></var>
</td>
</tr>
<tr>
<td>7.0.0</td>
<td>
新加 <code class="parameter">options</code> 参数。
</td>
</tr>
<tr>
<td>5.3.0</td>
<td>
如果函数调用失败返回 <strong><code>FALSE</code></strong>
之前版本返回了 <strong><code>TRUE</code></strong>
</td>
</tr>
<tr>
<td>4.3.3</td>
<td>
在 PHP 4.3.3 中,
会话开始之后调用 <span class="function"><strong>session_start()</strong></span> 函数
会引发 <strong><code>E_NOTICE</code></strong> 级别的错误,
并且第二次请求开始会话的调用会被忽略。
</td>
</tr>
</tbody>
</table>
</p>
</div>
<div class="refsect1 examples" id="refsect1-function.session-start-examples">
<h3 class="title">范例</h3>
<div class="refsect2 unknown-examplet" id="refsect2-function.session-start-unknown-examplet">
<h4 class="title">基本的会话示例</h4>
<p class="para">
<div class="example" id="example-5840">
<p><strong>Example #1 <var class="filename">page1.php</var></strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;page1.php<br /><br /></span><span style="color: #0000BB">session_start</span><span style="color: #007700">();<br /><br />echo&nbsp;</span><span style="color: #DD0000">'Welcome&nbsp;to&nbsp;page&nbsp;#1'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'favcolor'</span><span style="color: #007700">]&nbsp;=&nbsp;</span><span style="color: #DD0000">'green'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'animal'</span><span style="color: #007700">]&nbsp;&nbsp;&nbsp;=&nbsp;</span><span style="color: #DD0000">'cat'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'time'</span><span style="color: #007700">]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;</span><span style="color: #0000BB">time</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">//&nbsp;如果使用&nbsp;cookie&nbsp;方式传送会话&nbsp;ID<br /></span><span style="color: #007700">echo&nbsp;</span><span style="color: #DD0000">'&lt;br&nbsp;/&gt;&lt;a&nbsp;href="page2.php"&gt;page&nbsp;2&lt;/a&gt;'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;如果不是使用&nbsp;cookie&nbsp;方式传送会话&nbsp;ID则使用&nbsp;URL&nbsp;改写的方式传送会话&nbsp;ID<br /></span><span style="color: #007700">echo&nbsp;</span><span style="color: #DD0000">'&lt;br&nbsp;/&gt;&lt;a&nbsp;href="page2.php?'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">SID&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">'"&gt;page&nbsp;2&lt;/a&gt;'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</pre></div>
</div>
</div>
</p>
<p class="para">
请求 <var class="filename">page1.php</var> 页面之后,
第二个页面 <var class="filename">page2.php</var>
会包含会话数据。
请查阅 <a href="ref.session.html" class="link">会话参考</a>
获取更多关于 <a href="session.idpassing.html" class="link">会话 ID 传送</a>的信息,
在该参考页面中有关于常量 <strong><code>SID</code></strong> 的详细说明。
</p>
<p class="para">
<div class="example" id="example-5841">
<p><strong>Example #2 <var class="filename">page2.php</var></strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;page2.php<br /><br /></span><span style="color: #0000BB">session_start</span><span style="color: #007700">();<br /><br />echo&nbsp;</span><span style="color: #DD0000">'Welcome&nbsp;to&nbsp;page&nbsp;#2&lt;br&nbsp;/&gt;'</span><span style="color: #007700">;<br /><br />echo&nbsp;</span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'favcolor'</span><span style="color: #007700">];&nbsp;</span><span style="color: #FF8000">//&nbsp;green<br /></span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'animal'</span><span style="color: #007700">];&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;cat<br /></span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">date</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y&nbsp;m&nbsp;d&nbsp;H:i:s'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'time'</span><span style="color: #007700">]);<br /><br /></span><span style="color: #FF8000">//&nbsp;类似&nbsp;page1.php&nbsp;中的代码,你可能需要在这里处理使用&nbsp;SID&nbsp;的场景<br /></span><span style="color: #007700">echo&nbsp;</span><span style="color: #DD0000">'&lt;br&nbsp;/&gt;&lt;a&nbsp;href="page1.php"&gt;page&nbsp;1&lt;/a&gt;'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</pre></div>
</div>
</div>
</p>
</div>
<div class="refsect2 unknown-unknown-exampleu" id="refsect2-function.session-start-unknown-unknown-exampleu">
<h4 class="title">调用 <span class="function"><strong>session_start()</strong></span> 的时候指定选项</h4>
<div class="example" id="example-5842">
<p><strong>Example #3 覆盖 Cookie 超时时间设定</strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;设置&nbsp;cookie&nbsp;的有效时间为&nbsp;1&nbsp;<br /></span><span style="color: #0000BB">session_start</span><span style="color: #007700">([<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'cookie_lifetime'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">86400</span><span style="color: #007700">,<br />]);<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</pre></div>
</div>
</div>
<div class="example" id="example-5843">
<p><strong>Example #4 读取会话之后立即关闭会话存储文件</strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;如果确定不修改会话中的数据,<br />//&nbsp;我们可以在会话文件读取完毕之后立即关闭它<br />//&nbsp;来避免由于给会话文件加锁导致其他页面阻塞<br /></span><span style="color: #0000BB">session_start</span><span style="color: #007700">([<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'cookie_lifetime'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">86400</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'read_and_close'&nbsp;&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #0000BB">true</span><span style="color: #007700">,<br />]);</span>
</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="refsect1 notes" id="refsect1-function.session-start-notes">
<h3 class="title">注释</h3>
<blockquote class="note"><p><strong class="note">Note</strong>:
<p class="para">
要使用基于 cookie 的会话,
必须在输出开始之前调用 <span class="function"><strong>session_start()</strong></span> 函数。
</p>
</p></blockquote>
<blockquote class="note"><p><strong class="note">Note</strong>:
<p class="para">
建议使用 <a href="zlib.configuration.html#ini.zlib.output-compression" class="link">zlib.output_compression</a>
来替代 <span class="function"><a href="ob_gzhandler.html" class="function">ob_gzhandler()</a></span>
</p>
</p></blockquote>
<blockquote class="note"><p><strong class="note">Note</strong>:
<p class="para">
根据配置不同,本函数会发送几个 HTTP 响应头。
参考 <span class="function"><a href="session_cache_limiter.html" class="function">session_cache_limiter()</a></span>
来自定义 HTTP 响应头。
</p>
</p></blockquote>
</div>
<div class="refsect1 seealso" id="refsect1-function.session-start-seealso">
<h3 class="title">参见</h3>
<p class="para">
<ul class="simplelist">
<li class="member"><var class="varname"><var class="varname"><a href="reserved.variables.session.html" class="classname">$_SESSION</a></var></var></li>
<li class="member">
<a href="session.configuration.html#ini.session.auto-start" class="link">session.auto_start</a>
配置指示
</li>
<li class="member"><span class="function"><a href="session_id.html" class="function" rel="rdfs-seeAlso">session_id()</a> - 获取/设置当前会话 ID</span></li>
</ul>
</p>
</div>
</div></div></div></body></html>