php中的Session是什么
Session會話是存盤在服務器端的,相對比較安全,也并不像 Cookie 那樣有存盤長度的限制,
Session 作業原理
當啟動一個 Session 會話時,會生成一個隨機且唯一的 Session_id, 也就是 Session的檔案名,此時 Session_id 存盤在服務器的記憶體中,當關閉頁面是此 id 會自動注銷,重新登錄此頁面,會再次生成一個隨機且唯一的 id,
Session的功能
Session 在 Web 技術中非常重要,例如,在電子商務網站中,通過 Session 記錄用戶登陸的資訊,以及用戶所購買的商品,如果沒有 Session,那么用戶每進入一個頁面都需要登陸一次用戶名和密碼,
另外, Session 會話適用于存盤資訊量比較少的情況, 如果用戶需要存盤的資訊量相對較少,并且對存盤內容不需要長期存盤,那么使用 Session 把資訊存盤到服務器端比較合適,
php中如何配置Session
cookir的問題:用戶有權阻止 Cookie 使用,使 Web 服務器無法通過 Cookie 來跟蹤用戶資訊,而 Session 技術是將使用者相關的資料存放在服務器系統之下,所以使用者無法停止 Session 的使用,
php.ini設定參考項: 1. 處理session存取的模式 session.save_handler = files 2. session檔案存放路徑 session.save_path = /tmp 3. session使用cookie的功能,啟動: 1 session.use_cookies = 1 4. session名字 session.name = PHPSESSID 5. 自動啟動;0:關;1:開啟 session.auto_start = 0 6. session使用cookie的生存期,以秒為單位 session.cookie_lifetime = 0 7. cookie有效作用域名 session.cookie_domain = "a.com" 8. 概率是 session.gc_probability/session.gc_divisor 結果 1/1000;不建議設定過小,因為session的垃圾回收,是需要檢查每個檔案是否過期的 session.gc_probability = 1 session.gc_divisor = 1000 9. 過期時間 默認24分鐘 session.gc_maxlifetime = 1440
php中如何啟動Session會話
Session 的設定與 Cookie 不同,必須先行啟動,在PHP中必須呼叫 session_start()函式,以便讓 PHP 核心程式將和 Session相關的內建環境 變數預先載入到記憶體中,
注意: 通常,session_start()函式在頁面開始位置呼叫,然后會話變數被登錄到資料 $_SESSION,
說明:如果使用基于 Cookie 的 Session,在使用該函式開啟 Session之前,不能有任何輸出的內容,因為基于 Cookie 的 Session 實在開啟的時候,呼叫 session_start()函式生成唯一的一個 Session ID,需要保存在客戶端計算機的 Cookie 中,所以使用 session_start()函式之前瀏覽器不能有任何輸出,即使是空格和空行也不行,否則會產生輸出字串產生的錯誤,
如果不想在每個腳本中都使用 session_start()函式 來開啟 Session,可以在 php.ini 里面設定 session.auto_start = 1,就不需要每次使用 Session 之前都要呼叫 session_start()函式,但啟用這個選項也是有一些限制的,就是不能將物件放入 Session 中,因為類定義必須在啟動 Session 之前加載, 所以一般不建議使用session.auto_start來開啟 Session,
php中如何注冊和讀取Session會話
注冊Session會話
<?php session_start(); // 啟動 Session $_SESSION['name'] = null; // 宣告一個名為 name 的變數,并設定為空值 null, ?>
讀取Session會話
例如:判斷存盤用戶名的 Session 會話變數是否為空,如果不為空,則將該會話變數賦予 $my_value,其代碼顯示如下:
<?php if(!empty($_SESSION['session_name'])){ //判斷存盤用戶名的 Session 會話變數是否為空 $my_value = $_SESSION['session_name']; //將會話變數賦予一個變數 $my_value } ?>
php中如何洗掉和銷毀Session
當使用完一個 Session 變數后,可以將其洗掉;當完成一個會話以后,也可以將其銷毀,如果用戶想退出 Web 系統,就需要為他提供一個注銷的功能,把他的所有資訊在服務器中銷毀,
(1)洗掉單個會話
洗掉單個會話即洗掉單個會話的變數、同陣列的操作一樣,直接注銷 $_SESSION 陣列 的某個元素即可,
例如: $_SESSION['user']變數,可以使用 unset()函式,代碼如下所示:
unset( $_SESSION['user']);
注意: 使用 unset()函式時,要注意 $_SESSION 陣列中元素不能省略,即不可以一次注銷整個陣列,這樣會禁止整個會話的功能,如 unset($_SESSION)函式會將全域變數 $_SESSION 銷毀,而且沒有辦法將其回復,用戶也不能再注冊 $_SESSION 變數,
(2)洗掉多個會話
如果想把某個用戶在 Session 中注冊的所有變數都洗掉,也就是洗掉多個會話即一次注銷所有的會話變數,可以通過將一個空的陣列賦值給 $_SESSION來實作,其代碼顯示如下:
$_SESSION = array();
(3)結束當前會話
如果整個會話已經結束,首先應該注銷所有會話變數,然后使用 session_destroy()函式清除結束當前的會話,并清慷訓話中的所有資源,徹底銷毀Session,其代碼如下顯示:
session_destroy();
下面將通過一個實體,提供完整的代碼,運行該腳本后就可以關閉 Session,并銷毀與本次會話有關的所有資源,
<?php //開啟session session_start(); //洗掉所有session變數 $_SESSION = array(); //判斷cookie中是否存在session id if(isset($_COOKIE[session_name()])){ setcookie(session_name(),'',time()-3600,'/'); } //徹底銷毀session session_destroy();
php中Session的自動回識訓制詳解
一般情況下,可以通過在頁面提供的一個“退出” 按鈕,單擊來銷毀本次會話,但是用戶如果沒有點擊退出按鈕,而是直接關閉瀏覽器,或者斷網,或者斷電直接關閉計算機等情況下,在服務器端保存的 Session 檔案是不會被洗掉的,雖然關閉了瀏覽器,下次需要分配一個新的 Session ID 重新登錄,但這只是因為在 php.ini 中的設定 session.cookie_lifetime = 0, 來設定 Session ID 在客戶端 Cookie 中的有效期限,以秒為單位指定了發送到瀏覽器的 Cookie 的生命周期,值為0 表示 “直到關閉瀏覽器”,默認為 0.
當系統賦予 Session 有效期限后,不管瀏覽器是否開啟,Session ID 都會自動消失,而客戶端的 Session ID 消失,服務端保存的 Session 檔案并沒有被洗掉,所以沒有被 Session ID 參考 的服務器端 Session 檔案,就成為 “ 垃圾 ”, 為了防止這些垃圾 Session 檔案對系統造成過大的負荷(因為 Session 并不像 Cookie 是一種半永久性的存在), 對于永遠也用不上的 Session 檔案(垃圾檔案),系統有自動清理的機制,
“ 垃圾回收程式 ” 是什么樣的啟動機制呢?
“ 垃圾回收程式 ” 是在呼叫 session_start()函式時啟動的, 而一個網站有多個腳本,每個腳本又都要使用 session_start()函式開啟會話,又會有很多個用戶同時訪問,這就很有可能使得 session_start()函式在 1秒內被呼叫了 N 次,而如果每次都會啟動 “ 垃圾回收程式 ” ,這樣就很不合理了,即使最少控制在 15分鐘以上啟動一次 “ 垃圾回收程式 ” ,一天也要清理 100多次,這樣太頻繁了, 通過在 php.ini 檔案中修改 session.gc_probability 和 session.gc_divisor 兩個選項,設定啟動垃圾回收程式的概率,系統會根據session.gc_probability/session.gc_divisor 公式計算概率,例如選項 session.gc_probability = 1,選項 session.gc_divisor = 100,這樣概率就變成了 1/100,也就是 session_start()函式被呼叫 100 次才會啟動一次 “ 垃圾回收程式 ” ,所以對會話頁面訪問越頻繁,啟動的概率就越來越小,一般的建議為 呼叫1000-5000次才會啟動一次: 1/(1000~5000),
php中如何傳遞Session ID
1.通過 Cookie 來傳遞 Session ID
如果客戶端沒有禁止 Cookie,則在 PHP腳本中通過 session_start()函式進行初始化后,服務器會自動發送 HTTP 標頭將 Session ID 保存到客戶端計算機的 Cookie 中,
2. 通過 URL 來傳遞 Session ID
如果客戶端瀏覽器支持 Cookie,就把 Session ID 作為 Cookie 保存在瀏覽器中,但如果用戶禁止 Cookie 的使用,則瀏覽器中就不存在作為 Cookie 的 Session ID,因此在客戶端請求中不包含 Cookie 資訊,
在 PHP 中提供了跟蹤 Session 的另一種機制,如果客戶端瀏覽器不支持 Cookie,則 PHP 可以重寫客戶端請求 URL,把Session ID 添加到 URL 中,可以手動在每個超鏈接的 URL 中都添加一個 Session ID,這種方法作業量比較大,一般不建議使用這種方式,其示例的代碼如下所示:
<?php //開啟 session session_start(); // 在 URL 后面附加引數,變數名為session_name()獲取的名稱,值為session_id()獲取 echo '<a href="https://www.cnblogs.com/chenyingying0/p/test.php?'.session_name().'='.session_id().'">演示</a>'; ?>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/33651.html
標籤:PHP
上一篇:php cookie使用實體
下一篇:php Session方法實體
