亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

深入講解PHP Session及如何保持其不過期的方法

2024-05-04 23:38:49
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了深入講解PHP Session及如何保持其不過期的方法,包括對Session回收機制的講解以及SessionId保持不變的問題的解決,需要的朋友可以參考下

SESSION的實現中采用COOKIE技術,SESSION會在客戶端保存一個包含session_id(SESSION編號)的COOKIE;在服務器端保存其他session變量,比如session_name等等。當用戶請求服務器時也把session_id一起發送到服務器,通過 session_id提取所保存在服務器端的變量,就能識別用戶是誰了。同時也不難理解為什么SESSION有時會失效了。

當客戶端禁用COOKIE時(點擊IE中的“工具”—“Internet選項”,在彈出的對話框里點擊“安全”—“自定義級別”項,將“允許每個對話COOKIE”設為禁用),session_id將無法傳遞,此時 SESSION失效。不過php5在linux/unix平臺可以自動檢查cookie狀態,如果客戶端設置了禁用,則系統自動把session_id附加到url上傳遞。windows主機則無此功能。

Session常見函數及用法?

Session_start() :開始一個會話或者返回已經存在的會話。

說明:這個函數沒有參數,且返回值均為true。如果你使用基于cookie的session(cookie-based sessions),那么在使用Session_start()之前瀏覽器不能有任何輸出,否則會發生以下錯誤:

Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2)…………

你可以在php.ini里啟動session.auto_start=1,這樣就無需每次使用session之前都要調用session_start()。但啟用該選項也有一些限制,如果確實啟用了 session.auto_start,則不能將對象放入會話中,因為類定義必須在啟動會話之前加載以在會話中重建對象。

請求結束后所有注冊的變量都會被序列化。已注冊但未定義的變量被標記為未定義。在之后的訪問中這些變量也未被會話模塊定義,除非用戶以后定義它們。

警告: 有些類型的數據不能被序列化因此也就不能保存在會話中。包括 resource 變量或者有循環引用的對象(即某對象將一個指向自己的引用傳遞給另一個對象)。

注冊SESSION變量 :

PHP5使用$_SESSION[‘xxx']=xxx注冊SESSION全局變量。和GET,POST,COOKIE的使用方法相似。

注意:session_register(),session_unregister ,session_is_registered在php5下不再使用,除非在php.ini里把register_globle設為on,不過出于安全考慮,強烈建議關閉register_globle。HTTP_SESSION_VARS也不提倡使用了,官方建議用$_SESSION代替之。例如:

Page1.php

 

 
  1. <?php 
  2. Session_start(); //使用SESSION前必須調用該函數。 
  3.  
  4. $_SESSION[‘name']=”我是黑旋風李逵!”; //注冊一個SESSION變量 
  5.  
  6. $_SESSION[‘passwd']=”mynameislikui”; 
  7. $_SESSION[‘time']=time(); 
  8. echo ' 
  9. 通過COOKIE傳遞SESSION'; //如果客戶端支持cookie,可通過該鏈接傳遞session到下一頁。 
  10.  
  11. echo ' 
  12. . SID . '">通過URL傳遞SESSION';//客戶端不支持cookie時,使用該辦法傳遞session. 
  13.  
  14. ?> 

Page2.php

 

 
  1. <?php 
  2. session_start(); 
  3. echo $_SESSION['name']; // 
  4.  
  5. echo $_SESSION['passwd']; // 
  6.  
  7. echo date('Y m d H:i:s'$_SESSION['time']); 
  8. echo ' 
  9. 返回山一頁'; 
  10. ?> 

有兩種方法傳遞一個會話 ID:

cookie

URL 參數

會話模塊支持這兩種方法。cookie 更優化,但由于不總是可用,也提供替代的方法。第二種方法直接將會話 ID 嵌入到 URL 中間去。

PHP 可以透明地轉換連接。除非是使用 PHP 4.2 或更新版本,需要手工在編譯 PHP 時激活。在 Unix 下,用 --enable-trans-sid 配置選項。如果此配置選項和運行時選項 session.use_trans_sid 都被激活(修改php.ini),相對 URI 將被自動修改為包含會話 ID。

session_id

session_id() 用于設定或取得當前session_id。php5中既可以使用session_id(),也可以通過附加在url上的SID取得當前會話的session_id和session_name。

如果session_id()有具體指定值的話,將取代當前的session_id值。使用該函數前必須啟動會話:session_start();

當我們使用session cookies時,如果指定了一個session_id()值,每次啟動session_start()都會往客戶端發送一個cookie值。不論當前session_id是否與指定值相等。

session_id()如果沒有指定值,則返回當前session_id();當前會話沒有啟動的話,則返回空字符串。

檢查session是否存在?

在以往的php版本中通常使用session_is_register()檢查session是否存在,如果您使用$_SESSION[‘XXX']=XXX來注冊會話變量,則session_is_register()函數不再起作用。你可以使用

isset($_SESSION[‘xxx'])來替代。

更改session_id session_regenerate_id() 更改成功則返回true,失敗則返回false。

使用該函數可以為當前session更改session_id,但不改變當前session的其他信息。例如:

 

 
  1. <?php 
  2. session_start(); 
  3. $old_sessionid = session_id(); 
  4. session_regenerate_id(); 
  5. $new_sessionid = session_id(); 
  6. echo "原始 SessionID: $old_sessionid 
  7. "; 
  8. echo "新的 SessionID: $new_sessionid 
  9. "; 
  10. echo
  11.  
  12. "; 
  13.  
  14. print_r($_SESSION); 
  15. echo""
  16. ?> 

session_name() 返回當前session的name或改變當前session的name。如果要改變當前session的name,必須在session_start() 之前調用該函數。注意:session_name不能只由數字組成,它至少包含一個字母。否則會在每時每刻都生成一個新的session id.

session改名示例:

 

 
  1. $previous_name = session_name("WebsiteID"); 
  2. echo "新的session名為: $previous_name 
  3. "; 
  4. ?> 

如何刪除session?

1、unset ($_SESSION['xxx']) 刪除單個session,unset($_SESSION['xxx']) 用來unregister一個已注冊的session變量。其作用和session_unregister()相同。 session_unregister()在PHP5中不再使用,可將之打入冷宮。

unset($_SESSION) 此函數千萬不可使用,它會將全局變量$_SESSION銷毀,而且還沒有可行的辦法將其恢復。用戶也不再可以注冊$_SESSION變量。

2、$_SESSION=array() 刪除多個session

3、 session_destroy()結束當前的會話,并清空會話中的所有資源。。該函數不會unset(釋放)和當前session相關的全局變量 (globalvariables),也不會刪除客戶端的session cookie.PHP默認的session是基于cookie的,如果要刪除cookie的話,必須借助setcookie()函數。

返回值:布爾值。

功能說明:這個函數結束當前的session,此函數沒有參數,且返回值均為true

session_unset() 如果使用了$_SESSION,則該函數不再起作用。由于PHP5必定要使用$_SESSION,所以此函數可以打入冷宮了。

下面是PHP官方關于刪除session的案例:

 

 
  1. <?php 
  2. // 初始化session. 
  3.  
  4. session_start(); 
  5. /*** 刪除所有的session變量..也可用unset($_SESSION[xxx])逐個刪除。****/ 
  6. $_SESSION = array(); 
  7. /***刪除sessin id.由于session默認是基于cookie的,所以使用setcookie刪除包含session id的cookie.***/ 
  8. if (isset($_COOKIE[session_name()])) { 
  9. setcookie(session_name(), '', time()-42000, '/'); 
  10.  
  11. // 最后徹底銷毀session. 
  12.  
  13. session_destroy(); 
  14. ?> 

由此我們可以得出刪除Session的步驟:

session_start()

$_SESSION=array()/unset($_SESSION['xxx'])

session_destroy()

解決PHP Session不過期以及SessionId保持不變的問題

session 回收機制:

PHP采用Garbage Collection process對過期session進行回收,然而并不是每次session建立時,都能夠喚起 ‘garbage collection' process ,gc是按照一定概率啟動的。這主要是出于對服務器性能方面的考慮,每個session都觸發gc,瀏覽量大的話,服務器吃不消,然而按照一定概率開啟gc,當流覽量大的時候,session過期機制能夠正常運行,而且服務器效率得到節省。細節應該都是多年的經驗積累得出的。

三個與PHP session過期相關的參數(php.ini中):

session.gc_probability = 1

session.gc_divisor = 1000

session.gc_maxlifetime = 1440

gc啟動概率 = gc_probability / gc_divisor = 0.1%

session過期時間 gc_maxlifetime 單位:秒

當web服務正式提供時,session過期概率就需要根據web服務的瀏覽量和服務器的性能來綜合考慮session過期概率。為每個session都開啟gc,顯然是不明智的,感覺有點“碰運氣”的感覺,要是訪問量小命中幾率就小。我在本機測試過程中,幾乎都沒有被命中過,sessionid幾天都不變,哪怕機器重啟。測試過程中,這個過期概率值要設置大一點命中幾率才高點。

通過修改php配置文件的過期概率值,可以“碰運氣”式的設置session過期,那有沒有更好的辦法呢?

下面寫的這個session類可以徹底解決session不過期以及sessionid不變的問題。

 

 
  1. <?php 
  2. /** 
  3. * 擴展Session類(簡單封裝) 
  4.  
  5. * @author slimboy 
  6. * 
  7. */ 
  8. class Session {  
  9.  
  10. /** 
  11. * 初始化 
  12. */ 
  13. static function _init(){  
  14. ini_set('session.auto_start', 0);  
  15. //Session::start();  
  16. }  
  17.  
  18. /** 
  19. * 啟動Session 
  20. */ 
  21. static function start() {  
  22. session_start();  
  23. }  
  24.  
  25. /** 
  26. * 設置Session 
  27.  
  28. * @param $name Session名稱 
  29. * @param $value 值 
  30. * @param $time 超時時間(秒) 
  31. */ 
  32. public static function set($name,$value,$time){  
  33. if(emptyempty($time)){  
  34. $time = 1800; //默認值  
  35. }  
  36. $_SESSION[$name] = $value;  
  37. $_SESSION[$name.'_Expires'] = time() + $time;  
  38. }  
  39.  
  40. /** 
  41. * 獲取Session值 
  42.  
  43. * @param $name Session名稱 
  44. */ 
  45. public static function get($name){  
  46. //檢查Session是否已過期  
  47. if(isset($_SESSION[$name.'_Expires']) && $_SESSION[$name.'_E 
  48. xpires']>time()){  
  49. return $_SESSION[$name];  
  50. }else{  
  51. Session::clear($name);  
  52. return null;  
  53. }  
  54. }  
  55.  
  56.  
  57. /** 
  58. * 設置Session Domain 
  59.  
  60. * @param $sessionDomain 域 
  61. * @return string 
  62. */ 
  63. static function setDomain($sessionDomain = null) {  
  64. $return = ini_get('session.cookie_domain');  
  65. if(!emptyempty($sessionDomain)) {  
  66. ini_set('session.cookie_domain'$sessionDomain);//跨 
  67. 域訪問Session  
  68. }  
  69. return $return;  
  70. }  
  71.  
  72.  
  73. /** 
  74. * 清除某一Session值 
  75.  
  76. * @param $name Session名稱 
  77. */ 
  78. static function clear($name){  
  79. unset($_SESSION[$name]);  
  80. unset($_SESSION[$name.'_Expires']);  
  81. }  
  82.  
  83.  
  84. /** 
  85. * 重置銷毀Session 
  86. */ 
  87. static function destroy(){  
  88. unset($_SESSION);  
  89. session_destroy();  
  90. }  
  91.  
  92.  
  93. /** 
  94. * 獲取或設置Session id 
  95. */ 
  96. static function sessionid($id=null){  
  97. return session_id($id);  
  98. }  
  99.  
  100. ?> 
  101. 簡單調用: 
  102.  
  103. <?php 
  104. //設置session  
  105. Session::set('UserId'$userid, 3600);  
  106. //讀取session 
  107. $userId = Session::get('UserId'); 
  108. ?> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲在线免费| 欧美在线视频免费播放| 亚洲风情亚aⅴ在线发布| 欧美日韩国产限制| 久久久久久国产精品三级玉女聊斋| 亚洲久久久久久久久久久| 欧美日韩成人网| 久久中文字幕一区| 国产精品久久久久影院日本| 亚洲视频日韩精品| 欧美日韩美女在线观看| 日韩av网站在线| 亚洲精品综合精品自拍| www.久久草.com| 国产福利精品av综合导导航| 97在线看免费观看视频在线观看| 欧美日韩国产精品一区二区三区四区| 国产一区红桃视频| 欧美精品18videosex性欧美| 国产精品一区二区在线| 国产成人av网| 亚洲一区二区三| 亚洲精品福利在线观看| 日韩最新中文字幕电影免费看| 亲子乱一区二区三区电影| 欧美性猛交xxxx富婆弯腰| 久久躁狠狠躁夜夜爽| 在线播放日韩欧美| 亚洲欧美日本另类| 这里只有精品视频| 色综合五月天导航| 亚洲国产欧美一区二区三区同亚洲| 日韩中文视频免费在线观看| 欧美老女人xx| 国模私拍一区二区三区| 日韩在线视频线视频免费网站| 精品激情国产视频| 在线视频免费一区二区| 久久国产精品久久久| 亚洲情综合五月天| 色悠久久久久综合先锋影音下载| 日韩中文字幕亚洲| 国产亚洲精品久久久久久牛牛| 亚洲人成电影网| 欧美日韩在线观看视频小说| 福利二区91精品bt7086| 色偷偷91综合久久噜噜| 91在线视频精品| 国产成人av网| 国内精品中文字幕| 亚洲欧洲在线播放| 国产精自产拍久久久久久| 国产一区二区三区久久精品| 狠狠综合久久av一区二区小说| 欧美日韩成人黄色| 久久91精品国产| 国产精品久久久久久久久| 日韩美女免费观看| 欧美香蕉大胸在线视频观看| 欧美午夜精品久久久久久久| 8090理伦午夜在线电影| 亚洲乱码国产乱码精品精| 日韩激情视频在线| 91精品国产91久久久久久不卡| 日韩成人av一区| 欧美一区二粉嫩精品国产一线天| 亚洲欧美国产视频| 久久精视频免费在线久久完整在线看| 77777亚洲午夜久久多人| 欧美日韩国产一区二区| 欧美中文在线免费| 亚洲精品720p| 国产日韩中文在线| 亚洲视屏在线播放| 欧美激情videoshd| 欧美丰满老妇厨房牲生活| 96精品久久久久中文字幕| 欧美成人午夜剧场免费观看| 国产精品久久久久一区二区| 91视频国产一区| 欧美人与物videos| 欧美日本中文字幕| 美乳少妇欧美精品| 久久综合伊人77777尤物| 久热在线中文字幕色999舞| 久久免费视频观看| 久久九九有精品国产23| 91久久久精品| 黑人狂躁日本妞一区二区三区| 国产精欧美一区二区三区| 亚洲色图第一页| 久久久久久久久久国产| 欧美大片网站在线观看| 欧洲成人免费aa| 亚洲欧美精品伊人久久| 日韩欧美有码在线| 92国产精品久久久久首页| 国产日韩欧美在线观看| 国产精品久久网| 欧美在线视频免费播放| 欧美日韩一区二区三区在线免费观看| 成人午夜在线观看| 欧美电影免费观看大全| 久久久视频精品| 欧美在线中文字幕| 国产欧美一区二区三区在线看| 久久久久久久97| 国产精品入口免费视| 亚洲精品电影网站| 国产一区二区三区久久精品| 欧美性xxxx极品hd欧美风情| 懂色aⅴ精品一区二区三区蜜月| 亚洲在线观看视频网站| 成人亲热视频网站| 在线观看视频亚洲| 国产性色av一区二区| 欧美成人午夜影院| 国产精品丝袜白浆摸在线| 久久精品视频网站| 国模精品视频一区二区| 欧美日韩精品在线视频| 欧美黑人xxxx| 国产一区二区三区丝袜| 亚洲人成在线一二| 日韩精品免费看| 中文字幕亚洲图片| 精品国产一区二区三区久久狼黑人| 日韩激情在线视频| 亚洲欧美日本精品| 中文字幕精品久久久久| 亚洲欧美在线看| 久久网福利资源网站| 欧美日韩亚洲一区二区| 久久夜色精品亚洲噜噜国产mv| 7777精品视频| 黑人巨大精品欧美一区二区三区| 亚洲视频999| 日韩精品视频在线免费观看| 欧美午夜视频在线观看| 欧美国产亚洲精品久久久8v| 中文字幕综合在线| 亚洲电影免费观看高清完整版在线| 国产成人在线视频| 中文字幕亚洲一区二区三区| 日韩成人av在线播放| 日韩精品在线视频美女| 国产精品久久久久久久app| 国产精品嫩草影院一区二区| 久久精品精品电影网| 一本大道久久加勒比香蕉| 午夜精品www| 成人国内精品久久久久一区| 国产精品久久久亚洲| 久久九九热免费视频| 亚洲精品一区二区网址| 一区二区亚洲欧洲国产日韩| 91精品国产乱码久久久久久蜜臀| 国内精品久久久久久久| 中文字幕欧美日韩va免费视频| 亚洲欧美精品suv| 91精品视频免费| 成人女保姆的销魂服务| 91在线看www| 成人亚洲欧美一区二区三区|