我正在創建一個上載功能,用戶上傳的文件以用戶的會話ID作爲其名稱存儲在服務器上。現在,我只想將該文件保存在服務器上,直到該會話處於活動狀態。找出具有特定ID的會話是否已過期
所以,我的問題是,我怎樣才能確定從會話ID,會話是否活動或過期,以便在後面的情況下,我可以安全地刪除用戶上傳的文件。
這個我想在特定的時間間隔做清理,也許通過使用cron作業,儘管我從來沒有使用過它。
我正在創建一個上載功能,用戶上傳的文件以用戶的會話ID作爲其名稱存儲在服務器上。現在,我只想將該文件保存在服務器上,直到該會話處於活動狀態。找出具有特定ID的會話是否已過期
所以,我的問題是,我怎樣才能確定從會話ID,會話是否活動或過期,以便在後面的情況下,我可以安全地刪除用戶上傳的文件。
這個我想在特定的時間間隔做清理,也許通過使用cron作業,儘管我從來沒有使用過它。
你不能只依賴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();
}
?>
沒有測試...只是一個想法
間隔可以進行這樣的 - 有人打開你的網頁 - > PHP腳本運行 - >它會檢查文件是否是時間驅趕出局 - >刪除時間oted文件
且無需:-)
科雷如果用戶關閉或者沒有瀏覽器窗口(如果他沒有關閉它,但打開睡眠模式並在2天后回來 - 會話仍然活動AFAIK),由於缺少信息而確定幾乎不可能 - 只有想法以最好的方式解決這個問題,這是使用自己的會話引擎與AJAX檢查。
多數民衆贊成是一個很好的提示,遠離cron :)但應該有一些途徑知道會話是否過期,也許通過會話文件。比較創作日期和時間流逝等等。 – 2011-01-20 23:25:43
我試圖做同樣的事情。一種解決方案是使用session_set_save_handler()
來定義自定義垃圾收集器功能。在這個自定義函數中,您將刪除與會話關聯的上傳文件,然後從磁盤刪除會話。我認爲唯一的問題是,你必須定義會話處理程序的剩餘部分,以及:
bool session_set_save_handler (callback $open,
callback $close,
callback $read,
callback $write,
callback $destroy,
callback $gc)
這是很容易,如果你不依賴於PHP處理會話。有沒有辦法從自定義處理函數調用PHP的默認處理函數?
據我記得,它是web服務器的工作,以消除過期的會議,所以也許你可以掛鉤到這種機制? – Mchl 2011-01-20 23:13:07
@Mchl是的,你是對的,它是服務器的工作,刪除過期的會議,但我不想這樣做。我想刪除用戶上傳的文件,如果他的會話過期,否則會有大量不需要的文件佔用我的服務器空間。 – 2011-01-20 23:23:17