PHP 預設的 Session 機制會在 15 分鐘後自動清除變數,但在實際部署中,這項設定有時並不生效,導致 /tmp 目錄堆積大量 Session 檔案,影響伺服器效能。本文將示範如何透過修改 php.ini、建立分層儲存目錄、撰寫清理腳本並配合 Crontab 實現 Session 的定期自動清理。
開啟 php.ini,找到 session.save_path 並設定為分層路徑,例如:
session.save_path = "2;/tmp/session"
這會在 /tmp/session 下建立兩級子目錄(0-9、a-z 共 36×36=1296 個資料夾),有效分散檔案數量,避免單一目錄過大導致檔案系統效能下降。
新增 Shell 腳本 Cleartmpsen.sh,用於建立目錄結構、設定擁有者權限,並自動修改 php.ini:
#!/bin/bash
# Version:1.0
# Author:Byrd
# Site:www.t4x.org
# Contact:root#t4x.org
# This script will clear php session before 3 hours.
i="0 1 2 3 4 5 6 7 8 9 a b c d e f"
for byrd in $i; do
for x in $i; do
mkdir -p /tmp/session/$byrd/$x
done
done
chown -R bywww:bywww /tmp/session
chmod -R 1777 /tmp/session
# 清理 180 分鐘前的舊 Session 檔案
find /tmp/session -amin +180 -exec rm -rf {} \;
# 自動修改 php.ini(若尚未設定)
if [ `grep 'session.save_path =' /usr/local/php/lib/php.ini | wc -l` -eq 3 ]; then
sed -i 's#;session.save_path = "/tmp"#;session.save_path = "/tmp"\nsession.save_path = "2;/tmp/session"#g' /usr/local/php/lib/php.ini
else
exit 1
fi
編輯 root 的 Crontab,每週日凌晨 3 點執行清理腳本:
# This is a config php session BY:BYRD AT:2015-11-12 0 3 * * 0 /bin/bash /byrd/scripts/Cleartmpsen.sh >/dev/null 2>&1
修改 php.ini 後,必須重啟 PHP 進程(如 systemctl restart php-fpm 或 service php-fpm restart),Session 才會寫入新路徑。
完成上述步驟,即可實現 PHP Session 的自動分層儲存與定期清理,有效避免 /tmp 目錄爆滿導致的系統異常。