首頁 後端開發 PHP問題 php如何設定過期時間

php如何設定過期時間

Nov 04, 2020 am 11:38 AM
php

php設定過期時間的方法:先設定session並讀取session;然後透過「unset($_SESSION[$name]);」清除session;最後輸出「session::get('test') ;”已過期即可。

php如何設定過期時間

推薦:《PHP影片教學

嚴格設定php中session過期時間!

嚴格限制session在30分鐘後過期!

1.設定客戶端cookie的lifetime為30分鐘;

2.設定session的最大存活週期也為30分鐘;

3.為每個session值加入時間戳,然後在程式呼叫時進行判斷;

至於為什麼,我們首先來了解下PHP中session的基本原理:

php中的session有效期預設是1440秒(24分鐘),也就是說,客戶端超過24分鐘沒有刷新,當前session就會失效。當然如果使用者關閉了瀏覽器,會話也就結束了,Session自然也不存在了!

大家知道,Session儲存在伺服器端,根據客戶端提供的SessionID來得到這個使用者的文件,然後讀取文件,取得變數的值,SessionID可以使用客戶端的Cookie或Http1.1協定的

Query_String(就是存取的URL的「?」後面的部分)來傳送給伺服器,然後伺服器讀取Session的目錄…

要控制Session的生命週期,首先我們需要了解一下php.ini關於Session的相關設定(開啟php.ini文件,在“[Session]”部分):

1、session.use_cookies:預設的值是“1”,代表SessionID使用Cookie來傳遞,反之就是使用Query_String來傳遞;

2、session.name:這個就是SessionID儲存的變數名稱,可能是Cookie,也可能是Query_String來傳遞,預設值是「PHPSESSID」;

3、session.cookie_lifetime:這個代表SessionID在客戶端Cookie儲存的時間,預設是0,代表瀏覽器一關閉SessionID就作廢…就是因為這個所以Session不能永久使用!

4、session.gc_maxlifetime:這個是Session資料在伺服器端儲存的時間,如果超過這個時間,那麼Session資料就會自動刪除!

還有很多的設置,不過和本文相關的就是這些了,以下開始講如何設定Session的存活週期。

前面說過,伺服器透過SessionID來讀取Session的數據,但是一般瀏覽器傳送的SessionID在瀏覽器關閉後就沒有了,那麼我們只需要人為的設定SessionID並且保存下來,不就可以……

如果你擁有伺服器的操作權限,那麼設定這個非常非常的簡單,只是需要進行如下的步驟:

1、把「session.use_cookies」設定為1,使用Cookie來儲存SessionID,不過預設就是1,一般不用修改;

2、把「session.cookie_lifetime」改為你需要設定的時間(例如一個小時,就可以設定為3600,以秒為單位);

3、把「session.gc_maxlifetime」設定為和「session.cookie_lifetime」一樣的時間;

在PHP的文件中明確指出,設定session有效期限的參數是session.gc_maxlifetime。可以在php.ini檔案中,或透過ini_set()函數來修改此參數。問題在於,經過多次測試,修改這個

參數基本上不起作用,session有效期仍然保持24分鐘的預設值。

由於PHP的工作機制,它並沒有一個daemon線程,來定時地掃描session資訊並判斷其是否失效。當一個有效請求發生時,PHP會根據全域變數

session.gc_probability/session.gc_divisor(同樣可以透過php.ini或ini_set()函數來修改)的值,來決定是否要啟動一個GC( Garbage Collector)。

預設情況下,session.gc_probability = 1,session.gc_divisor =100,也就是說有1%的可能性會啟動GC。 GC的工作,就是掃描所有的session信息,用當前時間減去session的最後修

改時間(modified date),同session.gc_maxlifetime參數進行比較,如果生存時間已經超過gc_maxlifetime,就把該session刪除。

到此為止,工作一切正常。那為什麼會發生gc_maxlifetime無效的情況呢?

在預設情況下,session資訊會以文字檔案的形式,被儲存在系統的暫存檔案目錄中。在Linux下,這條路徑通常為\\tmp,在 Windows下通常為C:\\Windows\\Temp。當伺服器上有多個PHP應

使用時,它們會把自己的session檔案都保存在同一個目錄中。同樣地,這些PHP應用也會以一定機率啟動GC,掃描所有的session檔。

問題在於,GC在工作時,並不會區分不同網站的session。舉例言之,站點A的gc_maxlifetime設定為2小時,站點B的 gc_maxlifetime設定為預設的24分鐘。當站點B的GC啟動時,它會掃描

描公用的暫存檔案目錄,把所有超過24分鐘的session檔案全部刪除掉,而不管它們來自於網站A或B。這樣,站點A的gc_maxlifetime設定就形同虛設了。

找到問題所在,解決起來就很簡單了。修改session.save_path參數,或是使用session_save_path()函數,把儲存session的目錄指向一個專用的目錄,gc_maxlifetime參數運作正常了。

還有一個問題就是,gc_maxlifetime只能保證session生存的最短時間,並不能夠保存在超過這一時間之後session資訊立即會被刪除。因為GC是按機率啟動的,可能在某一個長時間內

都沒有被啟動,那麼大量的session在超過gc_maxlifetime以後仍然會有效。

解決這個問題的一個方法是,把session.gc_probability/session.gc_divisor的機率提高,如果提到100%,就會徹底解決這個問題,但顯然會對效能造成嚴重的影響。另一個方法是自己

只使用php實現,創建一個session類,在session寫入時,把過期時間也寫入。讀取時,根據過期時間判斷是否已過期。

class Session{  
      
        /** 
         * 设置session 
         * @param String $name   session name 
         * @param Mixed  $data   session data 
         * @param Int    $expire 超时时间(秒) 
         */  
        public static function set($name, $data, $expire=600){  
            $session_data = array();  
            $session_data['data'] = $data;  
            $session_data['expire'] = time()+$expire;  
            $_SESSION[$name] = $session_data;  
        }  
      
        /** 
         * 读取session 
         * @param  String $name  session name 
         * @return Mixed 
         */  
        public static function get($name){  
            if(isset($_SESSION[$name])){  
                if($_SESSION[$name]['expire']>time()){  
                    return $_SESSION[$name]['data'];  
                }else{  
                    self::clear($name);  
                }  
            }  
            return false;  
        }  
      
        /** 
         * 清除session 
         * @param  String  $name  session name 
         */  
        private static function clear($name){  
            unset($_SESSION[$name]);  
        }  
      
    }  
    demo.php  
      
    session_start();  
      
    $data = '123456';  
    session::set('test', $data, 10);  
    echo session::get('test'); // 未过期,输出  
    sleep(10);  
    echo session::get('test'); // 已过期
登入後複製

 

以上是php如何設定過期時間的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

See all articles