可能很多PHPer都用到了PHP提供的Session功能,可以方便的進(jìn)行會(huì )話(huà)功能處理,PHP服務(wù)端默認的session存儲是文件存放方式,在Windows上PHP默認的Session服務(wù)端文件存放在C:\WINDOWS\Temp下,*NIX下默認存放在/tmp下,如果說(shuō)并發(fā)訪(fǎng)問(wèn)很大或者session建立太多,在這兩個(gè)目錄下就會(huì )存在大量類(lèi)似sess_xxxxxx的session文件,同一個(gè)目錄下文件數過(guò)多會(huì )導致性能下降,并且可能導致受到攻擊最終出現文件系統錯誤。針對這樣的情況,PHP本身體提供了比較好的解決辦法。
  不少朋友可能都沒(méi)有注意到php.ini里面Session設置部分中有這樣一項:

;     session.save_path = "N;MODE;/path"


  這項設置提供給我們可以給session存放目錄進(jìn)行多級散列,其中“N”表示要設置的目錄級數,“MODE”表示目錄的權限屬性,默認為600,在WINDOWS上基本是不用設置的,*NIX上也可以不用設置,后面的“/path”表示session文件存放的根目錄路徑,比如我們設置為下面的格式

session.save_path = "2;/tmp/phpsession"

  上面的設置表示我們把/tmp/phpsession目錄作為php的session文件存放根目錄,在該目錄下進(jìn)行兩級目錄散列,每一級目錄分別是0-9和a-z共36個(gè)字母數字為目錄名,這樣存放session的目錄可以達到36*36個(gè),相信作為單臺服務(wù)器來(lái)說(shuō),這是完全夠用了,如果說(shuō)您的系統架構設計為多臺服務(wù)器共享session數據,可以把目錄級增加到3級或者更多。
  需要注意的是,php自己并不會(huì )自動(dòng)創(chuàng )建子目錄,需要您自己動(dòng)手去創(chuàng )建,網(wǎng)上找到這樣的自動(dòng)創(chuàng )建目錄的代碼,大家可以做個(gè)參考。下面的代碼自動(dòng)創(chuàng )建3級子目錄,可以自己動(dòng)手根據需要進(jìn)行修改。

<?php
set_time_limit(0);
$string = 0123456789abcdefghijklmnopqrstuvwxyz;
$length = strlen($string);
function makeDir($param)
{
    
if(!file_exists($param)) {
        
makeDir(dirname($param));
        
mkdir($param);
    
}
}
for($i = 0; $i < $length; $i++) {
    
for($j = 0; $j < $length; $j++) {
        
for($k = 0; $k < $length; $k++) {
            
makeDir($string[$i]./.$string[$j]./.$string[$k]);
        
}
    
}
}
?>

  大家可能注意到前面的文字中提到了有關(guān)多服務(wù)器共享php的SESSION,這是很多應用都會(huì )遇到的問(wèn)題,網(wǎng)上也有不少相關(guān)的資源,大家可以去google一下,Michael這里只提一下大概的思路。
  一般來(lái)說(shuō)我們用到最多的方法有兩種:
  1、NFS或者Samba共享的方法,讓各個(gè)服務(wù)器上存放session文件的磁盤(pán)共享,這種方法簡(jiǎn)單可行。
  2、集中存儲到數據庫中,這是比較多的實(shí)現方法,通過(guò)php提供的session_set_save_handler()函數來(lái)重定義session函數,推薦使用這種方法。

  歡迎大家一起交流和討論php中和session相關(guān)的技巧和經(jīng)驗。