PHP 預設機制:每請求有 1/100 機率觸發 GC(session.gc_probability=1, gc_divisor=100)。掃描 session.save_path 下 sess_* 文件,刪除修改時間超過 gc_maxlifetime(預設 1440 秒)的文件。
/tmp/sessions/sess_4b1e384ad74619bd212e236e52a5a174If 內容:username|s:9:"test";admin|s:1:"0";
| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| 調整 GC 概率 | 中小流量 | 零代碼修改 | 高併發下 GC 衝擊效能 |
| 定時腳本清理 | 所有場景 | 可控、不阻塞請求 | 需維護 crontab |
| tmpfs 內存文件系統 | 高併發、重啟可接受丟失 | 極快 I/O、自動過期 | 重啟丟失、佔用記憶體 |
| Memcache/Redis 存儲 | 分佈式、高可用 | 共享 Session、自動過期 | 引入外部依賴 |
| 資料庫存儲 | 需持久化審計 | 可查詢、事務支援 | 寫入延遲較高 |
# php.ini session.save_path = "3;/tmp/sessions" # 3 級子目錄分散 session.gc_probability = 0 # 關閉請求觸發 GC session.gc_divisor = 1000 session.gc_maxlifetime = 1440
#!/bin/bash # 刪除 0 byte 殘留文件 find /tmp/sessions -cmin +24 -name "sess_*" -size 0 -delete >/dev/null 2>&1 # 刪除過期文件 find /tmp/sessions -cmin +1440 -name "sess_*" -delete >/dev/null 2>&1
# /etc/fstab
tmpfs /tmp/sessions tmpfs defaults,size=5120m 0 0
# mount -a 生效
# 建立多級目錄腳本(rc.local 執行,早於 PHP-FPM 啟動)
dir="0 1 2 3 4 5 6 7 8 9 a b c d e f"
for a in $dir; do for b in $dir; do for c in $dir; do
mkdir -p /tmp/sessions/$a/$b/$c
done; done; done
chown -R root:www-data /tmp/sessions && chmod -R 1777 /tmp/sessions
生產環境建議:Redis/Memcache 做 Session 共享 + 定時腳本清理本地殘留文件,兼顧效能與可靠性。