首頁 >後端開發 >PHP問題 >php會話技術主要包含哪些

php會話技術主要包含哪些

silencement
silencement原創
2019-09-24 16:22:512688瀏覽

php會話技術主要包含哪些

本文主要講解php回話機制cookie和session。

cookie簡介

Cookie是儲存在客戶端瀏覽器中的數據,我們透過Cookie來追蹤與儲存使用者資料。一般情況下,Cookie會透過HTTP headers從服務端返回客戶端。多數web程式都支援Cookie的操作,因為Cookie是存在於HTTP的標頭之中,所以必須在其他資訊輸出先前進行設置,類似於header函數的使用限制。

PHP透過setcookie函數進行Cookie的設置,任何從瀏覽器發回的Cookie,PHP都會自動的將他儲存在$_COOKIE的全域變數之中,因此我們可以透過$_COOKIE['key' ]的形式來讀取某個Cookie值。

PHP中的Cookie具有非常廣泛的使用,經常用來儲存用戶的登入訊息,購物車等,且在使用會話Session時通常使用Cookie來儲存會話id來識別用戶,Cookie具備有效期,當有效期結束之後,Cookie會自動的從客戶端刪除。同時為了進行安全控制,Cookie還可以設定域跟路徑,我們會在稍後的章節中詳細的講解他們。

為了網站安全性起見,本網站暫時不提供Cookie變數顯示功能,請自行在本機測試;

設定cookie

##PHP設定Cookie最常用的方法就是使用setcookie函數,setcookie具有7個可選參數,我們常用到的為前5個:

name( Cookie名稱)可以透過$_COOKIE['name'] 進行訪問

value(Cookie的值)

expire(過期時間)Unix時間戳格式,預設為0,表示瀏覽器關閉即失效

path(有效路徑)如果路徑設定為'/',則整個網站都有效

domain(有效域)預設整個網域都有效,如果設定了'www.imooc.com',則只在www子網域中有效

$value = 'test';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600);  //有效期一小时
setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com"); //设置路径与域

PHP中還有一個設定Cookie的函數setrawcookie,setrawcookie跟setcookie基本上一樣,唯一的不同就是value值不會自動的進行urlencode,因此在需要的時候要手動的進行urlencode。

setrawcookie('cookie_name', rawurlencode($value), time()+60*60*24*365);

因為Cookie是透過HTTP標頭進行設定的,所以也可以直接使用header方法來設定。

header("Set-Cookie:cookie_name=value");

cookie的刪除與過期時間

透過前面的章節,我們了解了設定cookie的函數,但是我們卻發現php中沒有刪除Cookie的函數,在PHP中刪除cookie也是採用setcookie函數來實作。

setcookie('test', '', time()-1);

可以看到將cookie的過期時間設定到當前時間之前,則該cookie會自動失效,也就達到了刪除cookie的目的。之所以這麼設計是因為cookie是透過HTTP的標頭來傳遞的,客戶端根據服務端返回的Set-Cookie段來進行cookie的設置,如果刪除cookie需要使用新的Del-Cookie來實現,則HTTP頭就會變得複雜,實際上僅透過Set-Cookie就可以簡單明了的實作Cookie的設定、更新與刪除。

了解原理以後,我們也可以直接透過header來刪除cookie。

header("Set-Cookie:test=1393832059; expires=".gmdate('D, d M Y H:i:s \G\M\T', time()-1));

這裡用到了gmdate,用來產生格林威治標準時間,以便排除時差的影響。

session與cookie的異同

cookie將資料儲存在客戶端,建立起用戶與伺服器之間的聯繫,通常可以解決很多問題,但是cookie仍然具有一些限制:

cookie相對不是太安全,容易被盜用導致cookie欺騙

單一cookie的值最大隻能儲存4k

每次請求都要進行網絡傳輸,佔用頻寬

session是將使用者的會話資料儲存在服務端,沒有大小限制,透過一個session_id進行使用者識別,PHP預設情況下session id是透過cookie來保存的,因此從某種程度上來說,seesion依賴cookie。但這不是絕對的,session id也可以透過參數來實現,只要能將session id傳遞到服務端進行辨識的機制都可以使用session。

使用session

在PHP中使用session非常簡單,先執行session_start方法開啟session,然後透過全域變數$_SESSION進行session的讀寫。

session_start();
$_SESSION['test'] = time();
var_dump($_SESSION);

session會自動的對要設定的值進行encode與decode,因此session可以支援任意資料類型,包括資料與物件等。

session_start();
$_SESSION['ary'] = array('name' => 'jobs');
$_SESSION['obj'] = new stdClass();
var_dump($_SESSION);

預設情況下,session是以文件形式儲存在伺服器上的,因此當一個頁面開啟了session之後,會獨佔這個session文件,這樣會導致當前使用者的其他並發存取無法執行而等待。

刪除與銷毀session

刪除某個session值可以使用PHP的unset函數,刪除後就會從全域變數$_SESSION中移除,無法存取。

session_start();
$_SESSION['name'] = 'jobs';
unset($_SESSION['name']);
echo $_SESSION['name']; //提示name不存在

如果要刪除所有的session,可以使用session_destroy函數來銷毀目前session,session_destroy會刪除所有數據,但session_id仍然存在。

session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
session_destroy();

值得注意的是,session_destroy并不会立即的销毁全局变量$_SESSION中的值,只有当下次再访问的时候,$_SESSION才为空,因此如果需要立即销毁$_SESSION,可以使用unset函数。

session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
unset($_SESSION);
session_destroy(); 
var_dump($_SESSION); //此时已为空

如果需要同时销毁cookie中的session_id,通常在用户退出的时候可能会用到,则还需要显式的调用setcookie方法删除session_id的cookie值。

使用session来存储用户的登录信息

session可以用来存储多种类型的数据,因此具有很多的用途,常用来存储用户的登录信息,购物车数据,或者一些临时使用的暂存数据等。

用户在登录成功以后,通常可以将用户的信息存储在session中,一般的会单独的将一些重要的字段单独存储,然后所有的用户信息独立存储。

$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['userinfo'] = $userinfo;

一般来说,登录信息既可以存储在sessioin中,也可以存储在cookie中,他们之间的差别在于session可以方便的存取多种数据类型,而cookie只支持字符串类型,同时对于一些安全性比较高的数据,cookie需要进行格式化与加密存储,而session存储在服务端则安全性较高。

以上是php會話技術主要包含哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

相關文章

看更多