關於PHP中Session文件過多的問題


PHP的默認機制:每一次php請求,會有1/100的概率(默認值)觸發“session回收”。如果“session回收”發生,那就會檢查/tmp/sess_*的文件,如果最后的修改時間到現在超過了1440秒(gc_maxlifetime的值),就將其刪除,意味着這些session過期失效

一、session文件是什么

文件一般為 /tmp/sessions/sess_4b1e384ad74619bd212e236e52a5a174If

1
username|s:9: "test" ;admin|s:1: "0" ;

二、session回收何時發生

默認情況下,每一次php請求,就會有1/100的概率發生回收,所以可能簡單的理解為“每100次php請求就有一次回收發生”。這個概率是通過以下參數控制的

1
2
3
#概率是gc_probability/gc_divisor
session.gc_probability = 1
session.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, 修改或添加下面一行:

1
session.save_path = 3;600:/tmp/sessions

四、session清除腳本

1
2
3
4
#!/bin/sh
 
find /tmp/php-session -cmin +24 -name  "sess_*"  -and -size 0 - delete  > /dev/ null  2>&1
find /tmp/php-session -cmin +1440 -name  "sess_*"  - delete  > /dev/ null  2>&1

這里的時間我們可以通過 session.gc_maxlifetime 來獲取,放到定時任務里面即可(crontab)

其他方式

  • 使用memcache 等 ,(session.save_handler = memcache)

  • 使用cookie,但是cookie得加密

五、使用tmfs存儲session

1、將/tmp掛載為 tmpfs文件系統

修改/etc/fstab,在最后一行添加如下內容:/tmp/sessions tmpfs defaults,size=5120m 0 0

1
mount  -a 

2、創建session存儲文件夾

php並不會自動去創建這些文件夾,不過在源文件中提供了一些創建文件夾的腳本。下面這個腳本也好用,腳本內容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/sh
dir = "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z"
for  levela  in  $ dir ;
do
     for  levelb  in  $ dir ;
     do
         for  levelc  in  $ dir ;
         do
             mkdir  -p  /tmp/sessions/ $levela/$levelb/$levelc;
         done
     done ;
done
chown  -R www:www  /tmp/sessions  &&  chmod  -R 1777  /tmp/sessions

因為/tmp/sessions是用的內存,服務器重啟后,里面的所有文件都會丟失,所以,需要把上面的腳本加入到 /etc/rc.local中,並且要放在啟動php之前

3、將session存儲到不同的目錄中

php本身支持session的多級散列,在php.ini中,將 ;session.save_path = /tmp 改為

4、session的回收

使用上面的腳本即可

rm -f /tmp/sess_*

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM