2011-01-20 64 views
0

我正在創建一個上載功能,用戶上傳的文件以用戶的會話ID作爲其名稱存儲在服務器上。現在,我只想將該文件保存在服務器上,直到該會話處於活動狀態。找出具有特定ID的會話是否已過期

所以,我的問題是,我怎樣才能確定從會話ID,會話是否活動或過期,以便在後面的情況下,我可以安全地刪除用戶上傳的文件。

這個我想在特定的時間間隔做清理,也許通過使用cron作業,儘管我從來沒有使用過它。

+0

據我記得,它是web服務器的工作,以消除過期的會議,所以也許你可以掛鉤到這種機制? – Mchl 2011-01-20 23:13:07

+0

@Mchl是的,你是對的,它是服務器的工作,刪除過期的會議,但我不想這樣做。我想刪除用戶上傳的文件,如果他的會話過期,否則會有大量不需要的文件佔用我的服務器空間。 – 2011-01-20 23:23:17

回答

2

你不能只依賴session.gc_maxlifetime,因爲在這段時間之後,會話被標記爲垃圾,並且垃圾收集器默認啓動的概率僅爲1%(session.gc_probability)。

恕我直言,更好的方法是處理你的過期數據。

例如你可以開始的時間,並將其保存到一個會話變量:

<?php $_SESSION['last_seen'] = time();//Update this value on each user interaction. ?> 

Later..via的cron你可以做這樣的事情:

<?php 
//Get the session id from file name and store it into the $sid variable; 
session_id($sid);//try to resume the old session 
session_start(); 
if (isset($_SESSION['last_seen']) && $_SESSION['last_seen'] > $timeout){//Session is expired 
    //delete file 
    session_destroy(); 
}else if (!isset($_SESSION['last_seen')){ //already garbaged 
    //delete file 
    session_destroy(); 
} 
?> 

沒有測試...只是一個想法

0

間隔可以進行這樣的 - 有人打開你的網頁 - > PHP腳本運行 - >它會檢查文件是否是時間驅趕出局 - >刪除時間oted文件

且無需:-)

科雷

如果用戶關閉或者沒有瀏覽器窗口(如果他沒有關閉它,但打開睡眠模式並在2天后回來 - 會話仍然活動AFAIK),由於缺少信息而確定幾乎不可能 - 只有想法以最好的方式解決這個問題,這是使用自己的會話引擎與AJAX檢查。

+0

多數民衆贊成是一個很好的提示,遠離cron :)但應該有一些途徑知道會話是否過期,也許通過會話文件。比較創作日期和時間流逝等等。 – 2011-01-20 23:25:43

2

我試圖做同樣的事情。一種解決方案是使用session_set_save_handler()來定義自定義垃圾收集器功能。在這個自定義函數中,您將刪除與會話關聯的上傳文件,然後從磁盤刪除會話。我認爲唯一的問題是,你必須定義會話處理程序的剩餘部分,以及:

bool session_set_save_handler (callback $open, 
           callback $close, 
           callback $read, 
           callback $write, 
           callback $destroy, 
           callback $gc) 

這是很容易,如果你不依賴於PHP處理會話。有沒有辦法從自定義處理函數調用PHP的默認處理函數?