可能很多PHPer都用到了PHP提供的Session功能,可以方便的進(jìn)行會(huì)話功能處理,PHP服務(wù)端默認(rèn)的session存儲(chǔ)是文件存放方式,在Windows上PHP默認(rèn)的Session服務(wù)端文件存放在C:\WINDOWS\Temp下,*NIX下默認(rèn)存放在/tmp下,如果說(shuō)并發(fā)訪問(wèn)很大或者session建立太多,在這兩個(gè)目錄下就會(huì)存在大量類似sess_xxxxxx的session文件,同一個(gè)目錄下文件數(shù)過(guò)多會(huì)導(dǎo)致性能下降,并且可能導(dǎo)致受到攻擊最終出現(xiàn)文件系統(tǒng)錯(cuò)誤。針對(duì)這樣的情況,PHP本身體提供了比較好的解決辦法。
不少朋友可能都沒(méi)有注意到php.ini里面Session設(shè)置部分中有這樣一項(xiàng):
這項(xiàng)設(shè)置提供給我們可以給session存放目錄進(jìn)行多級(jí)散列,其中“N”表示要設(shè)置的目錄級(jí)數(shù),“MODE”表示目錄的權(quán)限屬性,默認(rèn)為600,在WINDOWS上基本是不用設(shè)置的,*NIX上也可以不用設(shè)置,后面的“/path”表示session文件存放的根目錄路徑,比如我們?cè)O(shè)置為下面的格式
上面的設(shè)置表示我們把/tmp/phpsession目錄作為php的session文件存放根目錄,在該目錄下進(jìn)行兩級(jí)目錄散列,每一級(jí)目錄分別是0-9和a-z共36個(gè)字母數(shù)字為目錄名,這樣存放session的目錄可以達(dá)到36*36個(gè),相信作為單臺(tái)服務(wù)器來(lái)說(shuō),這是完全夠用了,如果說(shuō)您的系統(tǒng)架構(gòu)設(shè)計(jì)為多臺(tái)服務(wù)器共享session數(shù)據(jù),可以把目錄級(jí)增加到3級(jí)或者更多。
需要注意的是,php自己并不會(huì)自動(dòng)創(chuàng)建子目錄,需要您自己動(dòng)手去創(chuàng)建,網(wǎng)上找到這樣的自動(dòng)創(chuàng)建目錄的代碼,大家可以做個(gè)參考。下面的代碼自動(dòng)創(chuàng)建3級(jí)子目錄,可以自己動(dòng)手根據(jù)需要進(jìn)行修改。
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,這是很多應(yīng)用都會(huì)遇到的問(wèn)題,網(wǎng)上也有不少相關(guān)的資源,大家可以去google一下,Michael這里只提一下大概的思路。
一般來(lái)說(shuō)我們用到最多的方法有兩種:
1、NFS或者Samba共享的方法,讓各個(gè)服務(wù)器上存放session文件的磁盤(pán)共享,這種方法簡(jiǎn)單可行。
2、集中存儲(chǔ)到數(shù)據(jù)庫(kù)中,這是比較多的實(shí)現(xiàn)方法,通過(guò)php提供的session_set_save_handler()函數(shù)來(lái)重定義session函數(shù),推薦使用這種方法。
歡迎大家一起交流和討論php中和session相關(guān)的技巧和經(jīng)驗(yàn)。
不錯(cuò),以前就注意到這個(gè)功能,不過(guò)一直沒(méi)試過(guò),現(xiàn)在正好一試:)
另外,關(guān)于session,我遇到了一個(gè)調(diào)試了幾乎一個(gè)下午也沒(méi)解決的問(wèn)題,不知Michael有沒(méi)有遇到過(guò),簡(jiǎn)單地說(shuō)就是下面的三段代碼:
index.php:
diogin.php:
another.php:
這樣,訪問(wèn)index.php,將新建一個(gè)session,然后刪除,再檢查cookie數(shù)組。這三段代碼是能正常工作的,可以把session使用的cookie刪除。但當(dāng)我把類似的代碼集成進(jìn)系統(tǒng)后,想用setcookie來(lái)刪除會(huì)話cookie,就行不通,調(diào)試了一下午都沒(méi)解決。不知這里是不是有什么需要注意的事情我沒(méi)察覺(jué)到,Michael遇到過(guò)類似的情況嗎?
啊,奇怪,源代碼怎么給過(guò)濾掉了?
那再發(fā)一次,不好意思:)
index.php:
session_save_path(’./’);
session_name(’DIOGIN_SESSID’);
session_start();
$_SESSION[’diogin’] = ‘haha’;
header(’Location: diogin.php’);
diogin.php:
session_save_path(’./’);
session_name(’DIOGIN_SESSID’);
if (isset($_COOKIE[’DIOGIN_SESSID’])) {
session_start();
$_SESSION = array();
session_destroy();
setcookie(’DIOGIN_SESSID’, false);
header(’Location: another.php’);
}
another.php:
var_dump($_COOKIE);
說(shuō)實(shí)話,我仔細(xì)看了您的留言,但是我還沒(méi)有搞明白你到底想實(shí)現(xiàn)的需求和功能,從你的代碼來(lái)看,很少看到這樣使用cookie和session的,不知道是為了滿足什么需求,通常來(lái)說(shuō),session在我們的應(yīng)用里面,迫不得已才使用,比如驗(yàn)證碼圖片,別的地方如果要使用到session,我們都是使用自己開(kāi)發(fā)的session管理,session存儲(chǔ)在內(nèi)存數(shù)據(jù)庫(kù)中。
如有可能,你可以再把要實(shí)現(xiàn)的需求整理一下告知。
有一個(gè)將 PHP Session 利用 memcached 來(lái)保存的類。好像是一個(gè)丹麥的人寫(xiě)的。
這位朋友說(shuō)得很對(duì),我用數(shù)據(jù)庫(kù)保存過(guò),為了多臺(tái)機(jī)器共享session,用memcached原理一樣,就是存儲(chǔ)和讀取的時(shí)候把從數(shù)據(jù)庫(kù)改成從memcached操作,另外還可以使用共享內(nèi)存,比如PHP的APC擴(kuò)展。