sessions.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="utf-8" lang="utf-8">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0" />
  6. <title>Session 类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档</title>
  7. <link rel="shortcut icon" href="http://codeigniter.org.cn/user_guide/../images/design/favicon.ico" type="image/x-icon" />
  8. <link rel="stylesheet" type="text/css" media="all" href="../userguide.css" />
  9. <link rel="search" href="http://codeigniter.org.cn/user_guide/../CodeIgniterSearch.xml" type="application/opensearchdescription+xml" title="CodeIgniter 搜索"/>
  10. <link rel="canonical" href="http://codeigniter.org.cn/user_guide/libraries/sessions.html" />
  11. <script type="text/javascript" src="../nav/mootools.js-ver=20130324.js"></script>
  12. <script type="text/javascript" src="../nav/mootools-more.js-ver=20130324.js"></script>
  13. <script type="text/javascript" src="../nav/nav.js-ver=20130324.js"></script>
  14. <script type="text/javascript" src="../nav/user_guide_menu.js-ver=20130324.js"></script>
  15. <meta name="robots" content="all" />
  16. <meta name="author" content="ExpressionEngine Dev Team" />
  17. <meta name="description" content="CodeIgniter 中文手册, CodeIgniter 用户指南, CodeIgniter User Guide, Wiki 文档" />
  18. </head>
  19. <body>
  20. <!-- START NAVIGATION -->
  21. <div id="nav">
  22. <div id="nav_inner">
  23. <script type="text/javascript">create_menu('../');</script>
  24. </div>
  25. </div>
  26. <script type="text/javascript">_setNavigation();</script>
  27. <div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="切换目录" alt="切换目录" /></a></div>
  28. <div id="masthead" class="clearfix">
  29. <div class="topbar-hd"><h1>CodeIgniter 用户指南 版本 2.2.0</h1></div>
  30. <div class="topbar-tip">编辑文档、查看近期更改请 <a href="#">登录</a> 或 <a href="#">注册</a>  <a href="#">找回密码</a></div> <div id="breadcrumb_right"><a href="../toc.html">目录页</a></div>
  31. </div>
  32. <!-- END NAVIGATION -->
  33. <!-- START BREADCRUMB -->
  34. <table cellpadding="0" cellspacing="0" border="0" style="width:100%">
  35. <tr>
  36. <td id="breadcrumb">
  37. <a href="#" target="_blank">CodeIgniter 中国首页</a>&nbsp;&#8250;&nbsp;
  38. <a href="../index.html">用户指南首页</a>&nbsp;&#8250;&nbsp;Session 类 </td>
  39. <td id="searchbox">
  40. <form method="get" action="http://www.google.com.hk/search" target="google_window">
  41. <input type="hidden" name="client" value="pub-0176846097796333"></input>
  42. <input type="hidden" name="forid" value="1"></input>
  43. <input type="hidden" name="ie" value="UTF-8"></input>
  44. <input type="hidden" name="oe" value="UTF-8"></input>
  45. <input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.org.cn/user_guide/" />
  46. 搜索用户指南&nbsp;
  47. <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />
  48. &nbsp;
  49. <input type="submit" class="submit" name="sa" value="Go" />
  50. </form>
  51. </td>
  52. </tr>
  53. </table>
  54. <!-- END BREADCRUMB -->
  55. <div style="clear:both;text-align:right;padding: 6px 40px 0 0;">
  56. <a href="#" target="_blank">查看原文</a>
  57. </div>
  58. <!--<br clear="all" />--><!-- START CONTENT -->
  59. <div id="content">
  60. <h1>Session 类</h1>
  61. <p>Session 类可以使用户在浏览您的网站时,维持他们的状态并跟踪他们的行为。
  62. Session 类将每个用户的 session 信息序列化(serialize)后存储到到 cookie 中(并同时进行加密)。
  63. 您还可以将 session 数据存储到数据库中来增强安全性,但是这时要求存储在用户 cookie 中的 session ID 值能与数据库中存储的用户 session ID 值相匹配。程序默认只在 cookie 中存储 session。如果您要在数据库中存储 session 的话,需要按照下面指示的方法,在您的数据库中创建需要的数据表。
  64. </p>
  65. <p class="important"><strong>注意:</strong>Session类并不使用PHP本身的session,而是使用类自己的session,这样做,可以给开发者提供更大的灵活性。</p>
  66. <p class="important"><strong>注意:</strong>即使没有使用加密会话,你也需要在配置文件里设置一个<a href="encryption.html">加密密钥</a>。这将有助于防止伪造 Session 数据。</p>
  67. <p class="important"><strong>注意:</strong>The Session class relies on the Encryption class, so you must have Mcrypt extension installed.</p>
  68. <h2>初始化 Session</h2>
  69. <p>Sessions会在每个页面载入后开始运行,所以session类必须首先被<a href="../general/libraries.html">初始化</a>。您可以在<a href="../general/controllers.html">控制器</a>中初始化,也可以在系统中<a href="../general/autoloader.html">自动加载</a>(译者注:在autoload.php设定)。session类的绝大部分都会在后台运行,所以初始化session时,它session数据会被自动读取、创建和更新。</p>
  70. <p>要在您的控制器构造函数中初始化session类,您可以使用 <dfn>$this-&gt;load-&gt;library</dfn> 函数:</p>
  71. <code>$this-&gt;load-&gt;library('session');</code>
  72. <p>一旦被载入, session就可以这样使用: <dfn>$this-&gt;session</dfn></p>
  73. <h2>Sessions 是怎样工作的?</h2>
  74. <p>当页面载入后,session类就会检查用户的cookie中是否存在有效的session数据。如果session数据不存在(或者已经过期),那么就会创建一个新的session并把他保存在cookie中。如果session数据存在,那么他的信息就会被更新,同时cookie也会被同时更新。每次更新都会重新生成session_id的值。</p>
  75. <p>对于您来说,需要知道的非常重要的一点就是,session类一旦被初始化,它就会自动运行。对于后面的事情,您可以完全不作理会。正如您将会在下面看到的一样,您可以正常使用session来工作,甚至还可以添加自己的session数据,而在这一切的过程中,读、写和更新的操作都是自动完成的。</p>
  76. <h2>Session 数据是什么?</h2>
  77. <p>一个 <em>session</em> 是由一个包括下列信息的数组组成的:</p>
  78. <ul>
  79. <li>唯一的用户Session ID (这是一个平均信息量统计出来的非常坚固的随机字符串,使用MD5加密,默认是每五分钟就重新生成一次。</li>
  80. <li>用户的 IP 地址</li>
  81. <li>用户浏览器信息(取前120个字符)</li>
  82. <li>最新的一个活跃时间戳.</li>
  83. </ul>
  84. <p>以上数据将会用以下数组格式序列化并存到cookie里:</p>
  85. <code>[array]<br />
  86. (<br />
  87. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'session_id'&nbsp;&nbsp;&nbsp;&nbsp;=> random hash,<br />
  88. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ip_address'&nbsp;&nbsp;&nbsp;&nbsp;=> 'string - user IP address',<br />
  89. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'user_agent'&nbsp;&nbsp;&nbsp;&nbsp;=> 'string - user agent data',<br />
  90. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'last_activity' => timestamp<br />
  91. )</code>
  92. <p>如果你将加密设置开启,serialized 的数组会先被加密,然后存入cookie中。这会让数据不容易被看到和修改,从而提高安全性。从<a href="encryption.html">这里</a>可以找到更多关于加密的信息。Session类会自动负责初始化和数据加密。</p>
  93. <p>注意: 默认情况下, Session Cookie 每隔 5 分钟才会更新一次,这样会减少对处理器的负荷。如果你重复的装载页面, 你会发现"上次活动"的时间在五分钟,或多于五分钟的时候才会变化,也就是 cookie 上次被写入的时间。 这个时间可以通过设置 application/config/config.php 文件里的 $config['sess_time_to_update'] 行来改变。</p>
  94. <h2>取得 Session 数据</h2>
  95. <p>可以通过如下的函数来得到 session 数组的任何信息:</p>
  96. <code>$this-&gt;session-&gt;userdata('<samp>item</samp>');</code>
  97. <p><samp>item</samp> 是数组里的相对应数据的索引。例如,想要获得 session ID, 你要使用如下的代码:</p>
  98. <code>$session_id = $this-&gt;session-&gt;userdata('<samp>session_id</samp>');</code>
  99. <p><strong>注意:</strong> 如果你的目标数据不存在的话,这个函数会返回 FALSE (布尔值boolean)。</p>
  100. <h2>添加自定义的 Session 数据</h2>
  101. <p>session 数组的一个非常有用的用途是你可以向它里面添加你自己的数据,这些数据会被保存在用户的 cookie 中。这样做的原因是什么呢?看看这个例子:</p>
  102. <p>假设,有个特定用户登陆到你的网站, 当他通过检测后 你可以添加他的用户名和电子邮件到 session cookie 中,这些信息可以在不去访问数据库的情况下,当成全局量来使用。</p>
  103. <p>通过以下函数,你可以传递一个新的用户数组到 session 数组中:</p>
  104. <code>$this-&gt;session-&gt;set_userdata(<samp>$array</samp>);</code>
  105. <p> <samp>$array</samp> 是一个结合数组,用来存储你的新数据。例如 :</p>
  106. <p><code>$newdata = array(<br />
  107. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'username'&nbsp; => 'johndoe',<br />
  108. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'email'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'johndoe@some-site.com',<br />
  109. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'logged_in' => TRUE<br />
  110. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
  111. <br />
  112. $this-&gt;session-&gt;set_userdata(<samp>$newdata</samp>);</code></p>
  113. <p>如果使用下面 set_userdata()函数的写法,可以每次只添加一个用户数据。</p>
  114. <p><code>$this-&gt;session-&gt;set_userdata('some_name', 'some_value');</code></p>
  115. <p class="important"><strong>注意:</strong> Cookies 只能存储 4KB 的数据, 使用时要小心超出它的容量。特别指出的是,加密会产生比原数据更长的数据字符串,所以一定要当心你要存放数据的大小。</p>
  116. <h2>取得所有 Session 数据</h2>
  117. <p>用下面的这种方式可以得到一个所有Session用户数据的数组:</p>
  118. <code>$this-&gt;session-&gt;all_userdata()</code>
  119. <p>代码将返回一个类似这样的关联数组:</p>
  120. <pre>
  121. Array
  122. (
  123. [session_id] => 4a5a5dca22728fb0a84364eeb405b601
  124. [ip_address] => 127.0.0.1
  125. [user_agent] => Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7;
  126. [last_activity] => 1303142623
  127. )
  128. </pre>
  129. <h2>删除 Session 数据</h2>
  130. <p>正如使用 set_userdata() 是用来添加信息到 session 中,而通过向 unset_userdata() 函数中传递 session key 可以用来删除这些信息。例如, 你想要从 session 信息里去掉 'some_name': </p>
  131. <p><code>$this-&gt;session-&gt;unset_userdata('some_name');</code></p>
  132. <p>也可以给这个函数传一个要删除项的关联数组。</p>
  133. <p><code>$array_items = array('username' => '', 'email' => '');<br />
  134. <br />
  135. $this-&gt;session-&gt;unset_userdata(<samp>$array_items</samp>);</code></p>
  136. <h2>闪出数据</h2>
  137. <p>CodeIgniter 支持 &quot;闪出数据&quot;, 或者说Session数据只对下次服务器请求可用, 然后会自动清除。这应该会非常有用,往往应用在信息或状态提示中(例如:“记录2已删除”)。</p>
  138. <p>注意: 闪出数据变量名以“flash_”开头,所以在你自己的变量名中要避免使用这个前缀。</p>
  139. <p>要添加闪出数据:</p>
  140. <p><code>$this-&gt;session-&gt;set_flashdata('item', 'value');</code></p>
  141. <p>你也可以使用和 set_userdata() 同样的方式向 set_flashdata() 传递一个数组。</p>
  142. <p>要读取一个闪出数据变量:</p>
  143. <p><code>$this-&gt;session-&gt;flashdata('item');</code></p>
  144. <p>如果你发现你需要在一个附加的请求中保留一个闪出数据,你可以使用 keep_flashdata() 这个函数。</p>
  145. <p><code>$this-&gt;session-&gt;keep_flashdata('item');</code></p>
  146. <h2>将 Session 数据存入数据库</h2>
  147. <p>由于Session数据数组是附带一个Session ID保存在用户cookie里的,你无法验证它,除非你把session数据存储在数据库中。在一些不需要或很少需要安全保护的应用中,session ID 或许并不需要。但如果你的应用需要安全保护,验证是必须的。否则,用户可以通过篡改Cookies来恢复旧的Session。</p>
  148. <p>当session 数据在数据库中可用时,每当从用户cookie中发现一个有效的session,一个数据库查询就会被执行以匹配它。如果 session ID 不相配,session 就会被销毁。Session ID永远不会更新,它们只会在一个新的会话创建时生成。</p>
  149. <p>为了存储session,你必须先创建一个数据表。这是 session 类所需的基本结构(用于MySQL的):</p>
  150. <textarea class="textarea" style="width:100%" cols="50" rows="10">
  151. CREATE TABLE IF NOT EXISTS `ci_sessions` (
  152. session_id varchar(40) DEFAULT '0' NOT NULL,
  153. ip_address varchar(45) DEFAULT '0' NOT NULL,
  154. user_agent varchar(120) NOT NULL,
  155. last_activity int(10) unsigned DEFAULT 0 NOT NULL,
  156. user_data text DEFAULT '' NOT NULL,
  157. PRIMARY KEY (session_id),
  158. KEY `last_activity_idx` (`last_activity`)
  159. );
  160. </textarea>
  161. <p><strong>注意:</strong> 默认情况下这个表叫做 <dfn>ci_sessions</dfn>, 但是你可以给它指定任意名字,只要你更新了 <kbd>application/config/config.php</kbd> 文件以确保它包含了你所起的名字。
  162. 一旦你创建了数据表,你就可以像下面这样在config.php文件中启用数据库选项:</p>
  163. <code>$config['sess_use_database'] = TRUE;</code>
  164. <p>一旦启用了,Session类就会在数据库中存储session数据。</p>
  165. <p>同时确保你已经在配置文件中指定了数据表名:</p>
  166. <code>$config['sess_table_name'] = 'ci_sessions';</code>
  167. <p class="important"><strong>注意:</strong> Session类已经内置了清除过期session的垃圾回收机制,因此你不需要编写你自己的事务来做这个。</p>
  168. <h2>销毁 Session </h2>
  169. <p>要清除当前 session: </p>
  170. <code>$this-&gt;session-&gt;sess_destroy();</code>
  171. <p class="important"><strong>注意:</strong> 此函数应该是最后被调用的。即使闪出变量已不再有效。如果你只想让某几项而不是所有项被销毁,请使用 <dfn>unset_userdata()</dfn>.</p>
  172. <h2>Session 的参数</h2>
  173. <p>你可以在<kbd>application/config/config.php</kbd> 文件中找到以下的 Session 相关的参数:</p>
  174. <table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder">
  175. <tr>
  176. <th>参数</th>
  177. <th>默认</th>
  178. <th>选项</th>
  179. <th>描述</th>
  180. </tr>
  181. <tr>
  182. <td class="td"><strong>sess_cookie_name</strong></td>
  183. <td class="td">ci_session</td>
  184. <td class="td">无</td>
  185. <td class="td">你想要保存 Session Cookie 的名字。</td>
  186. </tr>
  187. <tr>
  188. <td class="td"><strong>sess_expiration</strong></td>
  189. <td class="td">7200</td>
  190. <td class="td">无</td>
  191. <td class="td">session 持续的秒数。默认是2个小时(7200秒)。如果将这个数值设为: 0,就可以得到 永久 session。</td>
  192. </tr>
  193. <tr>
  194. <td class="td"><strong>sess_expire_on_close</strong></td>
  195. <td class="td">FALSE</td>
  196. <td class="td">TRUE/FALSE (boolean)</td>
  197. <td class="td">这个选项决定当浏览器窗口关闭时是否自动使session过期。</td>
  198. </tr>
  199. <tr>
  200. <td class="td"><strong>sess_encrypt_cookie</strong></td>
  201. <td class="td">FALSE</td>
  202. <td class="td">TRUE/FALSE (布尔值boolean)</td>
  203. <td class="td">是否对 session 数据加密.</td>
  204. </tr>
  205. <tr>
  206. <td class="td"><strong>sess_use_database</strong></td>
  207. <td class="td">FALSE</td>
  208. <td class="td">TRUE/FALSE (布尔值boolean)</td>
  209. <td class="td">是否将 session 数据存放入数据库中。在开启这个选项前,你要先创建一个数据库表。</td>
  210. </tr>
  211. <tr>
  212. <td class="td"><strong>sess_table_name</strong></td>
  213. <td class="td">ci_sessions</td>
  214. <td class="td">任何有效的 SQL 表名</td>
  215. <td class="td">session 数据库表的名字。</td>
  216. </tr>
  217. <tr>
  218. <td class="td"><strong>sess_time_to_update</strong></td>
  219. <td class="td">300</td>
  220. <td class="td">时间以秒计算</td>
  221. <td class="td">这个选项控制 session 类多久会产生一个新的session 和 session id。</td>
  222. </tr>
  223. <tr>
  224. <td class="td"><strong>sess_match_ip</strong></td>
  225. <td class="td">FALSE</td>
  226. <td class="td">TRUE/FALSE (布尔值boolean)</td>
  227. <td class="td">是否通过用户的IP地址来读取 session 的数据。 注意 ,有些网络运行商 ISPs 会动态的改变IP, 所以将这个选项设为 FALSE, 才有可能得到永久的 session。</td>
  228. </tr>
  229. <tr>
  230. <td class="td"><strong>sess_match_useragent</strong></td>
  231. <td class="td">TRUE</td>
  232. <td class="td">TRUE/FALSE (布尔值boolean)</td>
  233. <td class="td">是否要按照对应的 User Agent 来读取 session 数据。</td>
  234. </tr>
  235. </table><p>&nbsp;</p>
  236. <div id="Contributors">
  237. 翻译贡献者:
  238. aykirk, bearcat001, csfhc, Drice, Fanbin, guns1985, Hex, mchipengfei, mental, noproblem, phper08, qixingyue, shishirui, uicestone, xwjie</div>
  239. <div id="DocDate">
  240. 最后修改: 2014-06-10 14:08:32</div>
  241. </div>
  242. <!-- END CONTENT -->
  243. <div id="footer">
  244. <p>
  245. 上一个主题:&nbsp;&nbsp;<a href="security.html">安全类</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;<a href="#top">页首</a>
  246. &nbsp;&middot;&nbsp;&nbsp;<a href="../index.html">用户指南首页</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;下一个主题:&nbsp;&nbsp;<a href="trackback.html">Trackback 类</a> </p>
  247. <p><a href="#">CodeIgniter</a> &nbsp;&middot;&nbsp; 版权所有 &#169; 2006-2013 &nbsp;&middot;&nbsp; <a href="#">Ellislab, Inc.</a></p>
  248. <p>中文化: <a href="#">CodeIgniter 中国</a> &nbsp;&middot;&nbsp; 制作: Hex &nbsp;&middot;&nbsp; 版本: 1.30 &nbsp;&middot;&nbsp; 鸣谢: 子非鱼</p>
  249. </div>
  250. </body>
  251. </html>