在PHP 中,Session 是實現用戶身份識別、數據保持等功能的常用機制。默認情況下,Session 的生命週期和過期時間由服務器的配置文件(如php.ini )控制,但我們也可以通過session_start()之前的相關設置來自定義Session 生命週期。
本文將詳細講解如何通過session_start()設置Session 的生命週期和過期時間,以及相關注意事項。
Session 生命週期由兩個部分組成:
客戶端Cookie 的過期時間:瀏覽器關閉後是否還保留Session ID。
服務端Session 數據的保存時間:即服務器上存儲Session 數據的生存週期。
這兩者都需要正確設置才能實現你期望的Session 生命週期。
在調用session_start()之前,你可以使用以下兩個函數設置Session 生命週期:
session_set_cookie_params() :設置客戶端Cookie 的過期時間。
ini_set('session.gc_maxlifetime', 秒數) :設置服務端Session 數據的最大存活時間。
以下是一個設置Session 生命週期為1 小時(3600 秒)的示例:
<code> <?php // 設置服務器端Session 生命週期為1 小時ini_set('session.gc_maxlifetime', 3600); // 設置客戶端Cookie 生命週期為1 小時
session_set_cookie_params([
'lifetime' => 3600,
'path' => '/',
'domain' => 'm66.net',
'secure' => true, // 僅在HTTPS 下發送Cookie(根據需要啟用)
'httponly' => true, // 禁止JS 訪問Cookie,提高安全性
'samesite' => 'Lax' // 防止CSRF 攻擊,可選值: Lax、Strict、None
]);
// 啟動Session
session_start();
// 設置一個Session 變量
$_SESSION['user_id'] = 1234;
?>
</code>
session.gc_maxlifetime :控制服務器保留Session 數據的時間。默認值通常是1440 秒(24 分鐘)。
session_set_cookie_params()的lifetime參數決定了客戶端Cookie 的過期時間。如果為0,則表示“瀏覽器關閉即失效”。
即使設置了gc_maxlifetime ,PHP 的垃圾回收機制也不是每次請求都會清除過期Session。其清除的概率由以下配置項決定:
session.gc_probability = 1
session.gc_divisor = 100
表示有1% 的概率執行Session 清理。可根據需要調整。
如果你運行的是多個子域(如api.m66.net 、 admin.m66.net ),建議將domain設置為.m66.net以實現跨子域共享Session。
使用HTTPS 時,務必設置secure和httponly參數,以提升Session 安全性。
定期清理過期Session 文件,避免堆積佔用服務器空間。
通過合理配置session_set_cookie_params和session.gc_maxlifetime ,我們可以靈活控制PHP Session 的生命週期,更安全、更高效地管理用戶狀態。在調用session_start()前進行這些設置,是實現定制化Session 行為的關鍵步驟。