2008年3月19日 星期三

[PHP]設session.gc_maxlifetime,但gc卻沒有執行

這個回收處理系統裡面的session本身應該是隨機的處理在session
目錄裡面的session檔案.

你在這個設定中設定了分子項.但是沒有設定分母項所以,請除過期的session的機會還是只有預設的1%的機會.
所以你必須要設定你的分母為1,才會是 1/1=100%


<?php
ob_start();
ini_set('session.save_path',"C:\\php\\tmp2"); //設定在存目錄
ini_set('session.name', 'pissession'); // session值使用名稱
ini_set('session.gc_probability', 1); // 回收處理分子項
ini_set('session.gc_divisor', 1); // 回收處理分母項
ini_set('session.gc_maxlifetime', 15); // 清除以目前時間差中失效的過期session
ini_set('session.cookie_lifetime', 0); // Cookie的SID存在時間

echo $_SESSION['pis'];
if(isset($_SESSION['pis'])){
echo 'gc_maxlifetime = ' . ini_get('session.gc_maxlifetime') . "
";
echo 'logined:'.$_SESSION['pis'];
}else{
echo 'timeout';
}
?>


以這樣的設定,每一個SESSION在下次開啟SESSION_START時100%會去清除.
如果你的.ini_set('session.gc_divisor', 1); 設成2/那系統只有50%機會隨機去清除SESSION本的的值.

優點是在系統過期時.其他使用者,或者有任何人啟動 SESSION時.
就會將這個過期的 SESSION.全部移除.

不過缺點是系統的LOADING 會變的非常的沈重.尤其在大量使用者使用這個系統的時候.
系統會不間斷一直讀取你的SESSION目錄,以清除你的過期的垃圾SESSION.

另外.session.cookie_lifetime 的時間設成0 /表示使用者中止連線/系統預設為150-到300秒 (APACHE設定值)
之前你的SESSION ID沒有遺失之前你自己使用這個SESSION還是會被視為有效(因為系統好像會先查你的SESSION是否存在:不刪除正確的SESSION_ID取得檔),
但是,當有任何非目前的CLIENT 跑了一下SESSION_START的話.SESSION還是會被別的CLIENT移除.

也就是你開了一個視窗跑了一個SESSION你.就算過了15秒你還是一直可以用. //0-15秒
第16-N秒中間你的COOKIE如果還存在你SESSION_ID還可以用,你的SESSION 檔還是不會刪除 //0-16秒
16秒之後你如果再開一個流覽器去跑這個SESSION_START() 那你之前那個SESSION檔就會被剛除了.

結論是.
建議你如果要限制使用者登入的時間的話.
你可以在$_session中記一個時間值,自己去比對這個時間值是不是愈時.會更簡單容易.而且簡省資源.
為了整體的系統穩定.不建議調升垃圾處理時間.及垃圾資料的隨機處理機率

摘自:http://cc2007.php5.idv.tw/bb-3818.htm

沒有留言:

wibiya widget