PHP 会话控制

<p><strong>会话控制</strong></p><p>HTTP 协议是 WEB 服务器与浏览器相互通信的协议,它是一种无状态协议,即每个 HTTP 请求之间是相互独立的。因此,HTTP 协议没有一个内建的机制来维护两个事务之间的状态。比如,当一个用户在请求一个页面后再去请求另外一个页面时,HTTP 将无法告诉我们这两个请求是否来自同一个用户。</p><p>在网站中,我们经常需要跟踪一个变量:通过对变量的跟踪,使多个请求事物之间建立联系,再根据授权和用户身份显示不同的内容、不同页面。这就是会话控制技术。</p><p>常用的会话控制技术有 <span >Cookie</span> 和 <span >Session</span>。简单地说,Cookie 是通过在客户端中记录信息而确定用户身份;Session 是通过在服务器端记录信息而确定用户身份。</p><p><strong>Cookie</strong></p><p>Cookie 是一个很小的文本文件,包含在 HTTP 请求报文中在 Web 服务器和浏览器之间传递。Cookie 的工作原理如下:</p><p>服务器通过在 HTTP 响应报文中设置一个 Set-Cookie 字段,并把 Cookie 数据放在 Set-Cookie 字段中随着 HTTP 报文传给浏览器;</p><p>浏览器在接收到 HTTP 响应报文后,检查到 Set-Cookie 字段有值,会在本地创建一个 Cookie 文件来保存数据;</p><p>当浏览器再次向该服务器发送请求时,浏览器会先搜索本地保存的 Cookie 文件,如果在 Cookie 文件中有任何与正在连接的 URL 相关的 Cookie,就在 HTTP 请求报文中设置一个 Cookie 字段,并把 Cookie 文件中的数据添加到该字段中,最后把携带 Cookie 字段的 HTTP 请求报文发送给服务器。</p><p>Cookie 可以用来保存用户名、密码、个性化设置等一些简单的信息,以下是 Cookie 的使用说明:<br/></p><p>创建</p><p class="line number1 index0 alt2"><code class="php plain">&lt;?php</code></p><p class="line number1 index0 alt2"><code class="php plain">setcookie(</code><code class="php string">&quot;Cookie&quot;</code><code class="php plain">, </code><code class="php string">&quot;cookievalue&quot;</code><code class="php plain">, time()+3600);</code></p><p>必须在 HTML 文件的内容输出之前调用 setcookie()</p><p>接收</p><p class="line number1 index0 alt2"><code class="php plain">&lt;?php</code></p><p class="line number1 index0 alt2"><code class="php plain">echo </code><code class="php variable">$_COOKIE</code><code class="php plain">[</code><code class="php string">&quot;Cookie&quot;</code><code class="php plain">];</code></p><p>删除</p><p class="line number1 index0 alt2"><code class="php plain">&lt;?php</code></p><p class="line number1 index0 alt2"><code class="php plain">setcookie(</code><code class="php string">&quot;Cookie&quot;</code><code class="php plain">, null);//<span >方法一:将值设为空</span></code></p><p class="line number1 index0 alt2"><code class="php plain">setcookie(</code><code class="php string">&quot;Cookie&quot;</code><code class="php plain">, </code><code class="php string">&quot;value&quot;</code> <code class="php plain">, time()); //<span >方法二:将过期时间设为过去时间</span></code></p><p>Session</p><p>Session 是在服务器端保持用户会话数据的一种方法,其工作原理如下:</p><p>当浏览器第一次访问 PHP 脚本时,seesion_start() 函数会创建一个唯一的 Session ID(每个客户端都有一个唯一的标识),并自动通过 HTTP 的响应头,将这个 Session ID 保存到客户端 Cookie 中。同时,也在服务器端创建一个以 Session ID 命名的文件,用于保存这个用户的会话信息;</p><p>当同一个用户再次访问这个网站时,会自动通过 HTTP 的请求头将 Cookie 中保存的 Seesion ID 再携带过来;</p><p>服务器 PHP 脚本接受到客户端请求,这时 session_start() 函数就不会再去分配一个新的 Session ID,而是在服务器的硬盘中去寻找和这个 Session ID 同名的 Session 文件,将这之前为这个用户保存的会话信息读出。</p><p>首先,创建 Session 唯一标识的方法有两种:通过 Cookie 或者 GET 方式。PHP 在默认情况下使用 Session 会建立一个名叫PHPSESSID 的 Cookie(可以通过 php.ini 修改 session.name 的值),如果客户端禁用cookie,可以指定通过 GET 方式把 Session ID 传到服务器(修改 php.ini 中 session.use_trans_sid 等参数)。其次,Session 是以文件的形式保存的。php.ini 中有个配置项 --session.save_path= &quot;&quot; ,这个里面填写的路径,将会保存所有 Session 文件。Session 文件的命名格式是:sess_[PHPSESSID的值]。每一个文件,里面保存了一个会话的数据。最后,保存在 Session 文件中的数据是经过序列化处理的,比如:</p><pre class="brush:as3;toolbar:false">cityID|i:0;cityName|s:3:&quot;all&quot;;fanwe_lang|s:5:&quot;zh-cn&quot;;fanwe_currency|a:4:{s:2:&quot;id&quot;;s:1:&quot;1&quot;;s:6:&quot;name_1&quot;;s:9:&quot;人民币&quot;;s:4:&quot;unit&quot;;s:3:&quot;¥&quot;;s:5:&quot;radio&quot;;s:6:&quot;1.0000&quot;;}_fanwe_hash__|s:32:&quot;77c18770c6cb5d89444c407aaa3e8477&quot;;</pre><p>Session 同样可以用来保存用户名、密码、个性化设置等一些简单的信息,以下是 Session 的使用说明:</p><p>创建</p><p class="line number1 index0 alt2"><code class="php comments">//启动 session</code></p><p class="line number1 index0 alt2"><code class="php comments">session_start();//注册session变量</code></p><p class="line number1 index0 alt2"><code class="php comments">$_SESSION[&quot;username&quot;] = &quot;jochen&quot;;//赋值为一个用户的ID$_SESSION[&quot;uid&quot;] = 1;</code></p><p>注意:必须在 HTML 文件的内容输出之前调用 session_start()</p><p>读取</p><p class="line number1 index0 alt2"><code class="php plain">&lt;?php</code></p><p class="line number1 index0 alt2"><code class="php plain">session_start();</code></p><p class="line number1 index0 alt2"><code class="php functions">echo</code> <code class="php variable">$_SESSION</code><code class="php plain">[</code><code class="php string">&quot;username&quot;</code><code class="php plain">]; # # jochenecho</code></p><p class="line number1 index0 alt2"><code class="php variable">$_SESSION</code><code class="php plain">[</code><code class="php string">&quot;uid&quot;</code><code class="php plain">]; # 1</code></p><p>销毁</p><p class="line number1 index0 alt2"><code class="php plain">&lt;?php</code></p><p class="line number1 index0 alt2"><code class="php plain">session_start(); </code></p><p class="line number2 index1 alt1"><code class="php plain">unset(</code><code class="php variable">$_SESSION</code><code class="php plain">[</code><code class="php string">&quot;username&quot;</code><code class="php plain">]);</code></p><p class="line number2 index1 alt1"><code class="php plain">unset(</code><code class="php variable">$_SESSION</code><code class="php plain">[</code><code class="php string">&quot;uid&quot;</code><code class="php plain">]);</code></p><p>需要注意的是,当 session 文件比较多的情况下,将会产生 I/Q 读写性能问题。此时可以采用 memcached、redis 等缓存系统。</p>
RangeTime:0.007446s
RangeMem:211.49 KB
返回顶部 留言