關於PHP中Session檔案過多的問題,
PHP的預設機制:每一次php請求,會有1/100的機率(預設值)觸發“session回收”。如果“session回收”發生,那就會檢查/tmp/sess_*的檔案,如果最後的修改時間到現在超過了1440秒(gc_maxlifetime的值),就將其刪除,意味著這些session到期失效
一、session檔案是什麼
檔案一般為 /tmp/sessions/sess_4b1e384ad74619bd212e236e52a5a174If
username|s:9:"test";admin|s:1:"0";
二、session回收何時發生
預設情況下,每一次php請求,就會有1/100的機率發生回收,所以可能簡單的理解為“每100次php請求就有一次回收發生”。這個機率是通過以下參數控制的
#機率是gc_probability/gc_divisorsession.gc_probability = 1session.gc_divisor = 100
假設這種情況gc_maxlifetime=120,如果某個session檔案最後修改時間是120秒之前,那麼在下一次回收(1/100的機率)發生前,這個session仍然是有效。
如果你的session使用session.save_path中使用別的地方儲存session,session回收機制有可能不會自動處理到期session檔案。這時需要定時手動(或者crontab)的刪除到期的session
三、設定session儲存目錄
使用php5-fpm的話, 修改/etc/php5/fpm/php.ini, 修改或添加下面一行:
session.save_path = 3;600:/tmp/sessions
四、session清除指令碼
#!/bin/shfind /tmp/php-session -cmin +24 -name "sess_*" -and -size 0 -delete > /dev/null 2>&1find /tmp/php-session -cmin +1440 -name "sess_*" -delete > /dev/null 2>&1
這裡的時間我們可以通過 session.gc_maxlifetime 來擷取,放到定時任務裡面即可(crontab)
其他方式
五、使用tmfs儲存session
1、將/tmp掛載為 tmpfs檔案系統
修改/etc/fstab,在最後一行添加如下內容:/tmp/sessions tmpfs defaults,size=5120m 0 0
mount -a
2、建立session隱藏檔夾
php並不會自動去建立這些檔案夾,不過在源檔案中提供了一些建立檔案夾的指令碼。下面這個指令碼也好用,指令碼內容如下
#!/bin/shdir="0 1 2 3 4 5 6 7 8 9 a b c d e f"for levela in $dir;do for levelb in $dir; do for levelc in $dir; do mkdir -p /tmp/sessions/$levela/$levelb/$levelc; done done;donechown -R root:webgrp /tmp/sessions && chmod -R 1777 /tmp/sessions
因為/tmp/sessions是用的記憶體,伺服器重啟後,裡面的所有檔案都會丟失,所以,需要把上面的指令碼加入到 /etc/rc.local中,並且要放在啟動php之前
3、將session儲存到不同的目錄中
php本身支援session的多級散列,在php.ini中,將 ;session.save_path = /tmp 改為
session.save_path = "3;/tmp/sessions
4、session的回收
使用上面的指令碼即可
http://www.bkjia.com/PHPjc/1110329.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1110329.htmlTechArticle關於PHP中Session檔案過多的問題, PHP的預設機制:每一次php請求,會有1/100的機率(預設值)觸發session回收。如果session回收發生,那就會檢...