session是一種會話技術,它基于cookie,相比cookie具有更高的安全性。
如圖所示,session會給客戶端發送一個session id,同時在服務端建立一個session數據區,客戶端在請求的時候提交session id,服務端通過這個session id在session數據區查找??蛻舳藘H存了一個session id ,它具有一定的時效性,重要的信息還是保存在服務端的,所以session會比較安全。
session_set.php
<?php//定義session數據文件的存儲路徑,windows下默認是C:Windows empsession_save_path(getcwd().DIRECTORY_SEPARATOR.'temp');@session_start();echo session_id().'<hr>';//添加$_SESSION['name'] = 'tom';$_SESSION['age'] = 19;$_SESSION['height'] = 75.5;$_SESSION['edu'] = '小學';//修改$_SESSION['age'] = 22;//讀取var_dump($_SESSION);//刪除unset($_SESSION['edu']);echo '<hr>';var_dump($_SESSION);?>
來看看session保存數據的文件:
session數據區的內容都是通過序列化后的字符串保存的,讀取的時候再執行反序列化,session 支持多種數據類型存儲,而cookie只支持string.
session的使用是基于cookie的,必須在客戶端保存一個session id的cookie,那么服務端可以設置這個cookie的屬性來告訴瀏覽器如何生成這個cookie:
<?php//定義session數據文件的存儲路徑,windows下默認是C:Windows empsession_save_path(getcwd().DIRECTORY_SEPARATOR.'temp');session_name('MYPHPSESSID');//設置session_cookie名稱, 默認是PHPSESSID/** *session_set_cookie_params($lifetime, $path, $domain, $secure, $httponly) *$lifetime int 設置客戶端cookie的有效期,默認會話結束時 *$path string設置cookie的有效路徑 ,默認'/',可選參數 *$domain string 設置有效域,可選參數 *$secure boolean 是否僅在https下發送cookie 默認false,可選參數 *$httponly boolean 是否僅在http中可使用cookie 默認false,可選參數 *///設置cookie有效期60秒session_set_cookie_params(60, '/', '.phpcode.com', false, false) ;@session_start();echo session_id().'<hr>';$_SESSION['name'] = 'tom';?>
注意: session_set_cookie_params 必須要在 session_start()前設置。
session數據區的數據隨著用戶對服務器的訪問會產生越來越多的垃圾數據,所以有必須進行垃圾掃描和垃圾清理。當然服務器不可能時時去掃描哪些數據是過期了,那樣服務器損耗很大,所以呢必須一定幾率去觸發,判斷到是垃圾的就清理掉。
<?phpsession_save_path(getcwd().DIRECTORY_SEPARATOR.'temp');//設置cookie有效期60秒session_set_cookie_params(60, '/', '.phpcode.com', false, false) ;//設置為服務器被請求3次 有1次可能觸發gc ,進行垃圾回收ini_set('session.gc_probability', '1');ini_set('session.gc_divisor', '3');//默認1440秒后就被當為垃圾(最后一次寫+1440秒),gc的時候,把該session id對應的 session數據區刪除//設置為10秒后為垃圾ini_set('session.gc_maxlifetime', '10');@session_start();echo session_id();$_SESSION['name'] = 'tom';echo '<hr>';var_dump($_SESSION);?>
下面兩個參數是設置觸發垃圾掃描的概率
ini_set(‘session.gc_probability’, ‘1’);
ini_set(‘session.gc_divisor’, ‘3’);
設置多長時間后就是垃圾,可以被回收
ini_set(‘session.gc_maxlifetime’, ‘10’);
<?php//定義session數據文件的存儲路徑,windows下默認是C:Windows empsession_save_path(getcwd().DIRECTORY_SEPARATOR.'temp');//在session_start 前設置以下兩項ini_set('session.use_only_cookies', '0');ini_set('session.use_trans_sid', '1');@session_start();echo session_id();//添加$_SESSION['name'] = 'tom';echo '<hr>';var_dump($_SESSION);echo '<hr>';include 'show.html';?>
show.html
<!DOCTYPE html><html> <head> <meta charset='UTF-8'> <title>Insert title here</title> </head> <body> <a href='session_get_no_cookie.php'>forbidden cookie</a> <form method='post' action='session_get_no_cookie.php'> <input type='submit' value='submit'/> </form> </body></html>
session_get_no_cookie.php
<?php//定義session數據文件的存儲路徑,windows下默認是C:Windows empsession_save_path(getcwd().DIRECTORY_SEPARATOR.'temp');if(isset($_GET['PHPSESSID'])){ session_id($_GET['PHPSESSID']);}else if(isset($_POST['PHPSESSID'])){ session_id($_POST['PHPSESSID']);}echo session_id().'<hr>';session_start();var_dump($_SESSION);
通常來說session不提倡持久化。
如果非要持久化,如下設置:
session_set_cookie_params(PHP_INT_MAX);ini_set('session.gc_maxlifetime', PHP_INT_MAX);#注意一定要在session_start前設置??!
聯系:
Session基于COOKIE,session-id存儲于cookie中,cookie數據存放在客戶端瀏覽器上,session主要數據放在服務器上。
區別:
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答