理解PHP中會話控制


  如果以前沒有接觸過建站或網絡編程,只是從頭開始學PHP,以及用PHP來建立動態站點,那么會話(SESSION)對於初學者就有點難理解。那么到底什么是會話呢?理解一個概念需要從它產生的背景或問題出發,所以先回到它身處的Web環境以及它使用的HTTP協議。

  HTTP是無狀態協議,也就是說HTTP協議沒有一個內建的機制來維護兩個事務之間的狀態。當一個用戶在請求一個頁面后再去請求另外一個頁面時,HTTP將無法告訴我們這兩個請求是來自同一個用戶。由此我們就會覺得很奇怪了,平時我們在論壇逛帖子或電商網站購物時,只要我們在這個站點內,不論我們怎么跳轉,從一個頁面跑到另一個頁面,網站總會記得我是誰,比如告訴你購買了哪些東西。這是怎么做到的呢,估計大家猜到了,就是運用本文中提到的會話控制。

  會話控制的思想就是指能夠在網站中根據一個會話跟蹤用戶。那么PHP的會話是如何實現的呢?

  PHP的會話是通過唯一的會話ID來驅動的,會話ID是一個加密的隨機數字,它由PHP生成,在會話的生命周期中都會保存在客戶端。我們知道客戶端(也就是瀏覽器)保存數據的地方只有cookie,所以PHP的會話ID一般保存在用戶機器的cookie中。了解cookie后我們知道,瀏覽器是可以禁用cookie的,這樣的話會話功能就不是失效了嗎?所以PHP會話控制還有一種模式,就是在URL中傳遞會話ID。如果在瀏覽網站時我們稍加留心的話,有些URL中有一串看起來像隨機數字的字符串,那么其實很有可能就是URL這種形式的會話控制。

  講到這里,有些人可能會有疑問了,客戶端只是保存一個會話ID,那么會話控制中保存的會話變量比如你購物時買的物品列表等,它們是存放在哪個地方的呢?很顯然,會話變量是在服務器端使用的,那么這些會話變量必定存放在服務器端。默認情況下,會話變量保存在服務器的普通文件中(也可以自己配置使用數據庫來保存,可以Google一下),會話ID的作用就像是一把鑰匙,在服務器端保存會話的文件中找到該會話ID對應的會話變量,比如購買物品的列表。

  那么會話控制的整個過程可能就像這個樣子,用戶登錄或者第一次瀏覽某個站點的頁面時,該站點會生成一個PHP的會話ID並通過cookie發送到客戶端(瀏覽器)。當用戶點擊該站點的另一個頁面時,瀏覽器開始連接這個URL。在連接之前,瀏覽器會先搜索當地保存的cookie,如果在cookie中有任何與正在連接的URL相關的cookie,就將它提交到服務器。而剛好在登陸或第一次連接時,已經產生了一個與該網站URL相關的cookie(保存的會話ID),所以當用戶再次連接這個站點時,站點就可以通過這個會話ID識別出用戶,從服務器的會話文件中取出與這個會話ID相關的會話變量,從而保持事務之間的連續。

  下面開始實際介紹PHP的會話功能。

  使用會話的基本步驟如下:

  1)開始一個會話

    調用session_start()函數即可,函數的具體功能可以查閱PHP的文檔。需要注意的是,必須在使用會話的腳本開始部分調用這個函數,如果沒有,所有保存在該會話中的信息都無法在腳本中使用。除了手動調用session_start()函數外,也可以自動配置PHP自動調用,可以Google之。

  2)注冊一個會話變量

    從PHP4.1以后,會話變量保存在超級全局數組$_SESSION中。要創建一會話變量,只需要在數組中設置一個元素,如$_SESSION['myvar'] = 5;

  3) 使用一個會話變量

    要使用一個會話變量很簡單,使用$_SESSION數組訪問保存的會話變量即可,如 echo $_SESSION['mywar']; 會打印出 5。使用會話前必須首先使用session_start()函數啟動一個會話。

  4)注銷變量和銷毀會話

    注銷變量直接使用unset即可,如unset($_SESSION['myvar']),如何要一次銷毀所有會話變量,可以使用 unset($_SESSION); 當使用完一個會話后,首先應該注銷所有的變量,然后再調用session_destroy() 來清除會話ID。

  接下來,我們通過一個簡單的會話例子來結束本文。在這個例子中,我們實現了3個頁面。

<?php
//page1.php 啟動一個會話並注冊一個變量

session_start();

$_SESSION['sess_var'] = "Hello, world!";

echo 'The content of $_SESSION[\'sess_var\'] is ' . $_SESSION['sess_var'] . '<br />';
?>
<a href="page2.php">Next Page</a>
<?php
//page2.php 訪問一個會話並注銷它

session_start();

$_SESSION['sess_var'] = "Hello, world!";

echo 'The content of $_SESSION[\'sess_var\'] is ' . $_SESSION['sess_var'] . '<br />';

unset($_SESSION['sess_var']);

?>
<a href="page3.php">Next Page</a>
<?php
//page3.php 結束會話

session_start();

echo 'The content of $_SESSION[\'sess_var\'] is ' . $_SESSION['sess_var'] . '<br />';

session_destroy();

?>

  然后訪問page1.php然后依序點擊Next Page,可以發現瀏覽器中輸出中page1 和 page2都可以看到$_SESSION['sess_var']的值,page3則為空了。

  結合這個例子,我們就更好的理解了會話在PHP中的使用方法。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM