Session 與 Cookie 是 Web 狀態管理的雙支柱,php.ini 提供精細控制參數。本文逐項解析 Session/Cookie 相關指令,並說明執行期動態調整函式。
啟用 Cookie 作為 Session ID 傳輸載體。預設開啟,關閉則需靠 URL 重寫 (use_trans_sid) 或隱藏表單欄位傳遞,極不推薦。
Cookie 名稱 (或 URL 參數名)。建議自訂專屬名稱:
session.name = MYAPP_SESS
對應 Cookie 格式:MYAPP_SESS=abc123; Path=/; HttpOnly
URL 格式:/page.php?MYAPP_SESS=abc123
關鍵安全參數。啟用後完全禁止 URL 重寫傳遞 Session ID,防止 Session Fixation 攻擊。
預設 PHP 5.3+ 為 1,舊版可能為 0,**生產環境必須設為 1**。
| php.ini 參數 | 對應 setcookie() 參數 | 說明 | 建議值 |
|---|---|---|---|
session.cookie_lifetime | $expire | Cookie 存活秒數,0 = 瀏覽器關閉失效 (Session Cookie) | 0 |
session.cookie_path | $path | Cookie 生效路徑,/ 為全站 | / |
session.cookie_domain | $domain | Cookie 生效域名,.example.com 含子域名 | .example.com |
session.cookie_secure | $secure | 僅 HTTPS 傳輸 | 1 (僅 HTTPS 站點) |
session.cookie_httponly | $httponly | 禁止 JS 存取 (document.cookie) | 1 |
session.cookie_samesite | $samesite | 跨站請求攜帶策略:Lax/Strict/None | Lax |
<?php
// 必須在 session_start() 之前呼叫
session_set_cookie_params([
'lifetime' => 3600, // 1 小時
'path' => '/',
'domain' => '.example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
session_start();
// 獲取目前設定
var_dump(session_get_cookie_params());
/*
array(7) {
["lifetime"]=> int(3600)
["path"]=> string(1) "/"
["domain"]=> string(11) ".example.com"
["secure"]=> bool(true)
["httponly"]=> bool(true)
["samesite"]=> string(4) "Lax"
}
*/
?>
<?php
// 獲取目前名稱
echo session_name(); // MYAPP_SESS
// 變更名稱 (必須在 session_start() 前)
session_name('NEW_SESS_NAME');
session_start();
?>
<?php
// 獲取目前 ID
echo session_id(); // abc123def456
// 手動指定 ID (必須在 session_start() 前)
session_id('my_custom_id_123');
session_start();
// ⚠️ 自訂 ID 需符合 sid_length/bits_per_character 規則,否則會被重新產生
?>
| 參數 | 預設 | 說明 |
|---|---|---|
session.auto_start | 0 | 自動啟動 Session (不推薦,影響效能與彈性) |
session.serialize_handler | php | 序列化引擎:php, php_binary, igbinary (需擴充) |
session.gc_probability = 1
session.gc_divisor = 1000
; 機率 = 1/1000 = 0.1% 每請求觸發一次掃描
session.gc_maxlifetime = 1440
; 超過 1440 秒 (24分) 未存取的 Session 檔案視為垃圾刪除
⚠️ 多應用共用 save_path 但 gc_maxlifetime 不同時,**以最小值為準** 刪除,導致長壽命應用 Session 被誤刪。**解決:隔離 save_path**。
| 參數 | 預設 | 說明 |
|---|---|---|
session.referer_check | 空 | 驗證 HTTP Referer 含指定字串,不符則拒絕 Session ID (弱防禦) |
session.entropy_length | 0 | 從 entropy_file 讀取位元組數作為 ID 熵來源 (PHP 7.1+ 棄用,改用隨機源) |
session.entropy_file | 空 | 熵來源檔案,如 /dev/urandom (PHP 7.1+ 棄用) |
session.cache_limiter | nocache | nocache/private/public,控制 Session 頁面 HTTP 快取行為 |
session.cache_expire | 180 | 快取過期分鐘數 |
session.use_trans_sid | 0 | 透明 Session ID (URL 重寫),安全風險高,建議 0 |
url_rewriter.tags | a=href,area=href,frame=src,input=src,form=fakeentry | 透明 SID 重寫的 HTML 標籤屬性 |
[Session]
session.save_handler = files
session.save_path = "/var/lib/php/session"
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_secure = 0
session.cookie_httponly = 1
session.cookie_samesite = Lax
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
use_only_cookies=1 + cookie_httponly=1 + cookie_secure=1 (HTTPS) + cookie_samesite=Laxsession.name = APP_SESS 隱藏技術棧save_path,避免 GC 衝突session_set_cookie_params() 程式化控制session.gc_* 參數與實際 Session 檔案數量是否匹配精通這些參數,能讓你在單點登入 (SSO)、跨域共享 Session、微服務架構下的狀態管理等複雜場景中遊刃有餘。