abstract:一. PHP的session原理:1.開啟session_start(),服務器端產(chǎn)生session文件,將相關(guān)信息存儲到這個文件中,文件以"sess_"為前綴,連接session_id()值來命名(內(nèi)容是由特定算法生成的用戶的明文信息,大型項目則須進行加密處理),同時將sessionid保留到客戶端瀏覽器的cookie中。2.第二次開啟session_start(),瀏覽器判
一. PHP的session原理:
1.開啟session_start(),服務器端產(chǎn)生session文件,將相關(guān)信息存儲到這個文件中,文件以"sess_"為前綴,連接session_id()值來命名(內(nèi)容是由特定算法生成的用戶的明文信息,大型項目則須進行加密處理),同時將sessionid保留到客戶端瀏覽器的cookie中。
2.第二次開啟session_start(),瀏覽器判斷cookie中是否有sessionid,如果有,不再創(chuàng)建文件,而是直接使用這個sessionid訪問服務器,通過sessionid找對應的session文件,讀取session中內(nèi)容存儲到$_SESSION數(shù)組中。
注意:session_start()前不能有任何輸出,此函數(shù)向客戶端發(fā)一個session_id保存在cookie中。
二. PHP機制使用session:
1.開啟session
session_start();
2.存取session
$_SESSION['uname'] = 'chenwei';
3.銷毀session
unset($_SESSION['uname']); //刪除內(nèi)存中由session數(shù)組保存的變量;$_SESSION = array()清楚所有session變量
setCookie(session_name(), '', time()-1, '/'); //刪除客戶端cookie中的sessionid, session_name()默認是PHPSESSID
session_destory(); //銷毀服務器端session文件
三. PHP的session配置選項
查看session配置的最直接方式就是phpinfo(); 然后根據(jù)需要配置/usr/local/php/etc/php.ini文件里的session選項,其實一般默認就可以。
可以考慮更改的配置選項有:
session.cookie_lifetime = 0; //設(shè)置cookie保存時間(秒),相當于session的過期時間,0表示直到瀏覽器重啟
session.save_handler = files; //保存和取回數(shù)據(jù)的方式,默認為文件; 涉及到存儲機制,此處不作延伸
當然也可以不修改配置文件,使用系統(tǒng)函數(shù),達到同樣的效果:
setCookie(session_name(), session_id(), time()+1440, '/'); //設(shè)置cookie有效時間為1440秒(24’),解決關(guān)閉瀏覽器session丟失的現(xiàn)象;session在服務器上存的最長時間為24’,重新連接后才不會過期。(即保持登錄功能)
四. PHP的session自動回收機制(啟動概率 = session.gc_probability / session.gc_divisor)
session.gc_probability = 1 //啟動幾率
session.gc_divisor = 1000 //被除數(shù),因子
session.gc_maxlifetime = 1440 //設(shè)置session的最大過期時間,默認1440''
只要客戶端存在操作,session過期時間就會保持不減;當超過過期時間未操作,回收機制就會啟動,將服務端session刪除。
五. 基于URL傳遞session的id(解決客戶端禁用cookie的情況)
1. url傳參:
<a href="demo.php?<?php echo session_name().'='.session_id(); ?>">DEMO</a>
服務端處理:
$sid = !empty($_GET[session_name()]) ? $_GET[session_name()] : '';
session_id($sid); //設(shè)置用已有的sid開啟會話,在session_start()之前
session_start();
2. 如何自動判斷是否開啟了cookie,并使用對應的傳遞方式?(使用系統(tǒng)自帶SID常量,自動判斷)
<a href="demo.php?<?php echo SID; ?>">DEMO</a>
$sid = !empty($_GET[session_name()]) ? $_GET[session_name()] : '';
if($sid != ''){
session_id($sid);
}
3. 使URL自動加session的id?
enable_trans_uid配置選項,和運行時選項session.use_trans_sid都被激活時,當客戶端禁用cookie時,相對的URL將自動被修改為包含sessionid,如果沒有配置或使用Windows服務器,可以使用常量SID。