PHP會話管理和控制
session概述
我們知道Cookie是通過將數據保存在客戶端來實現與服務端保持連接的,而session是通過將數據保存在服務器端來實現保持連接的
我們之前拿開會的例子講了一個小例子:
在幾十年前人們開會的時候,都需要帶上一個參會證。這個參會證上有這個人的職務、姓名、單位、照片等信息。在開會的時候,會議安保人員、組織者只需要檢查相關信息就行了。
這個小例子主要說明一點,人們自己帶著自己的參會證,帶著自己的信息。這種模式就是cookie。
而電腦將這段cookie信息存在了電腦的硬盤裏。
Cookie存在哪兒? Cookie的本質是一小段數據,一小段存儲在你電腦硬盤中的數據。可是它存在哪裏呢?來,我們找一下。
Chrome瀏覽器的Cookie文件的存放路徑是:
C:\Users\你的用戶名\AppData\Local\Google\Chrome\User Data\Default\Cookies
Firefox瀏覽器的Cookies文件存放路徑是:
C:\Users\你的用戶名\AppData\Roaming\Mozilla\Firefox\Profiles\rdgp36vl.default\cookies.sqlite 每個人可能略有不同
用文本編輯器直接打開Cookies文件看到的是亂碼,我們得用工具查看,如下圖:
我們來看一下需要關註的幾個列,Domain代表的是cookies所屬的網站,Name代表的是這個Cookie的名字,Value代表的是Cookie的值,Expires代表的是這個Cookie的有效期。
用一個我們熟悉的網站舉例,tudou.com,圖上我們可以看到有4個關於 tudou.com 的Cookie,那麽當我們訪問 tudou.com的時候,瀏覽器會自動把這4個Cookie的 Name 和 Value 發送到 tudou.com 這個網址所指向的服務器(PS:必須在有效期內,超出有效期的話是不會被發送到服務器的,有效期我們可以依據需求來定),如此一來,服務器就可以根據這些信息來保持與客戶端的連接了,通俗點,就是可以通過這些數據來知道你就是你。當服務器收到這些Cookies後,會根據他們的值來做一些處理,做什麽處理?這就取決於開發人員想根據這些信息來幹嘛了!
PHP會話控制之PHP中的Cookie
這節我們通過一個用戶首次登陸網站後,再次訪問不需要重復輸入用戶名和密碼的例子來學習Cookie。
首先介紹一下php中設置cookie的方法。
php中提供了一個函數來讓我們設置cookie,這個函數是:
bool setcookie ( string $名字 [, string $值] [, int $過期時間 = 0] [, string $路徑] [, string $域名] [, bool $安全 = false] [, bool $http只讀 = false] );
參數 描述
$名字 必需。規定 cookie 的名稱。
$值 可選。規定 cookie 的值。
$有效期 可選。規定 cookie 的有效期。
$路徑 可選。規定 cookie 的服務器路徑。
$域名 可選。規定 cookie 的域名。
$安全 可選。規定是否通過安全的 HTTPS 連接來傳輸 cookie。
$http安讀 可選。如果true,那麽js就無法讀取改cookie,增加安全性。
一般來說,我們其實用不到上面那麽多參數,對於這個函數,我們一般這麽用: setcookie(cookie名,cookie值,cookie有效期);
沒錯,就那麽3個。如此一來,我們就可以在服務端通過$_COOKIE[‘name‘] 來讀取cookie了。
以下是示例:
我們將文件名命名為:cookie.php。
我們來模擬我們在互聯網上見到最常見的例子:輸入用戶名和密碼,登陸成功的過程。
我們來建一個數據庫login,其中有表user,有username和password這兩個字段。
<?php //第一次登陸的時候,通過用戶輸入的信息來確認用戶 if ( ( $_POST[‘username‘] != null ) && ( $_POST[‘password‘] != null ) ) { $userName = $_POST[‘username‘]; $password = $_POST[‘password‘]; //從db獲取用戶信息 //PS:數據庫連接信息改成自己的 分別為主機 數據庫用戶名 密碼 $conn = mysqli_connect(‘localhost‘,‘root‘,‘root‘); mysqli_select_db($conn,‘test‘); $sql = "select * from user where `username` = ‘$userName‘ "; $res = mysqli_query($conn,$sql); $row = mysqli_fetch_assoc($res); if ($row[‘password‘] == $password) { //密碼驗證通過,設置cookies,把用戶名和密碼保存在客戶端 setcookie(‘username‘,$userName,time()+60*60*24*30);//設置時效一個月,一個月後這個cookie失效 setcookie(‘password‘,$password,time()+60*60*24*30); //最後跳轉到登錄後的歡迎頁面 header(‘Location: welcome.php‘ . "?username=$userName"); } } //再次訪問的時候通過cookie來識別用戶 if ( ($_COOKIE[‘username‘] != null) && ($_COOKIE[‘password‘] != null) ) { $userName = $_COOKIE[‘username‘]; $password = $_COOKIE[‘password‘]; //從db獲取用戶信息 //PS:數據庫連接信息改成自己的 分別為主機 數據庫用戶名 密碼 $conn = mysqli_connect(‘localhost‘,‘root‘,‘root‘,‘test‘); $res = mysqli_query($conn,"select * from user where `username` = ‘$userName‘ "); $row = mysqli_fetch_assoc($res); if ($row[‘password‘] == $password) { //驗證通過後跳轉到登錄後的歡迎頁面 header(‘Location: welcome.php‘ . "?username=$userName"); } } ?> <html> <head> </head> <body> <form action="" method="POST"> <div> 用戶名:<input type="text" name="username" /> 密 碼:<input type="text" name="password" /> <input type="submit" value="登錄"> </div> </form> </body> </html>
跳轉到的welcome.php代碼
<?php $user = $_GET[‘username‘]; ?> <html> <head> </head> <body> welcome,<?php echo $user;?> </body> </html>
這樣,當我第一次訪問cookie.php的時候,我需要輸入用戶名和密碼,輸入完畢後跳轉到了welcome.php。然後我關閉瀏覽器,再次打開cookie.php,這次沒有要求我輸入用戶信息,而是直接跳轉到了welcome.php,因為之前我們存的cookie信息被瀏覽器自動發送到了服務端,服務端做完處理直接跳轉到了welcome.php,服務器認識我們了!知道我是之前那個登陸過的用戶,這樣我們就通過cookie技術讓無狀態的HTTP協議保持了狀態。
照著這個做一遍,我相信你會用cookie了。
只不過!!!只不過!!!只不過!!!重要的事要說3遍,我們一般是不會把用戶名和密碼放到cookie中的,因為這並不安全,容易泄露自己的信息,請不要把重要的信息放到cookie中。我們這個只是一個學習cookie的例子。
PHP會話控制之PHP中使用session
1.開啟session
首先我們要開啟session,那麽第一個要學習的函數就是
bool session_start()了,這個函數沒有參數。在php文件的開始使用
session_start();
就可以啟用新會話或者重用現有會話了。
2.添加session數據
開啟會話之後,那麽在接下來的處理中,我們就可以使用$_SESSION變量來存取信息了。我們要知道的是$_SESSION變量是個數組。當我們要把信息存入session的時候應該這麽寫:
$_SESSION[‘userName‘] = ‘wang‘;
3.讀取session數據
讀取很簡單,就像我們使用數組一樣,如下:
$userName = $_SESSION[‘userName‘];
當然也可以 $_SESSION[‘userName‘] 來用。和數組一樣的使用。
4.銷毀session數據
我們可以使用很多種方式來銷毀session數據。
a) unset函數
我們通過使用類似
unset($_SESSION[‘XXX‘]);
來銷毀session中的 XXX 變量。PS:請不要!請不要!請不要unset($_SESSION),會導致後續無法使用$_SESSION這個變量!!!
b) 空數組賦值給session變量
$_SESSION = array();
之前我們說過$_SESSOIN變量是個數組,那麽空數組賦值的話也是相當於將當前會話的$_SESSION變量中的值銷毀。
c) session_destory() 函數
這個函數會銷毀當前會話中的全部數據,並結束當前會話。但是不會重置當前會話所關聯的全局變量, 也不會重置會話 cookie。
5.session的擴展:默認session存儲在哪裏。
在php.ini配置文件中有這麽一行 session.save_handler = files,
files,說明了php默認的是用文件讀寫的方式來保存session的。那麽在哪個目錄呢?繼續看。session.save_path = "/tmp",
這一行前面有個 ; ,說明是被註釋的,不過即便這樣,php默認的
session 也是保存在這裏的,/tmp目錄。
我的寫入session的語句是:
$_SESSION[‘as‘] = ‘as‘;
解讀一下,第一個as代表的是$_SESSION[‘as‘]中的as,|後面的s表示的是這是一個字符串類型的數據,2表示的是這個字符串所占的字節數,最後雙引號引起來的是值as。
PHP會話管理和控制