2010-10-14 86 views
1

我正在使用PHP進行項目。我已將會話壽命設置爲0,以便當用戶關閉瀏覽器時,會話消失並且他/她已註銷。但是,我在DB中有一個狀態變量,它存儲了告訴我用戶是否登錄的信息。我用這個來通知其他用戶一個特定用戶的狀態。PHP:關於會話死亡更改DB

當會話死了,我怎麼能叫,這將改變我的數據庫中值的函數? 我看了覆蓋session_set_save_handler()。但是這需要我重寫整個函數並定義我自己的會話。有沒有一個函數可以用來更改我的數據庫變量?

有沒有更好的方法來實現我想要實現的目標?

感謝

編輯:對於那些在同樣的情況,因爲我,我沒有什麼建議nikic。我有一個記錄每個用戶訪問的每個頁面的日誌。爲了檢查用戶是否在線,我檢查我的數據庫以檢查是否設置了登錄變量,然後仔細檢查最近是否有一些活動知道用戶是否實際在線。

+0

會話超時不能用於判斷用戶是否在線。只需使用你自己的。跟蹤用戶活動並在最近3-5分鐘內對活動用戶進行計數。 – 2010-10-14 20:39:23

回答

1

沒有簡單的方法這樣做。通常情況下,網站會將用戶的最後一個操作保存到數據庫中,並說他只有在最近N分鐘內完成某項操作時纔會這樣做。此外,如果用戶手動註銷,也可以將最後一個操作時間設置爲0,以便將其考慮在內。

+0

我想到了這個想法,但這意味着我必須設置一個cron作業來查找用戶的最後一個動作時間。如果可能,我試圖找到更好的解決方案。看來我最終會覆蓋session_set_save_handler() – 2010-10-14 21:02:14

+0

@Nandit:我真的不明白爲什麼你需要爲此做一個cron工作。您只需將時間戳保存在數據庫中,並且只想列出所有用戶時,您只需執行「SELECT WHERE lastAction> DATE_SUB(NOW(),INTERVAL 5 MINUTES)'或類似的操作。 – NikiC 2010-10-14 21:20:36

+0

當然。我不知道我在想什麼。 謝謝。這爲我節省了很多麻煩。 編輯:但這意味着我必須每次用戶請求一個頁面時更新數據庫。我想盡可能避免那些額外的DB呼叫 – 2010-10-14 21:28:02

-1

實際上,expire time = 0的會話每當用戶發出請求時都會死亡。服務器無法知道瀏覽器是打開還是關閉,這就是爲什麼會話在X分鐘後過期(以及爲什麼我們將整個會話概念放在首位)。

+0

我使用session_set_cookie_params()將會話的生存期設置爲0。 值0表示「在瀏覽器關閉之前」。 來源:http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime – 2010-10-14 20:47:36

+0

well session_set_cookie_params是關於cookie(客戶端),而不是會話(服務器端) – cambraca 2010-10-15 14:43:09

0

PHP的會話垃圾收集器不提供任何回調機制可以觸發一個腳本來更新您的「用戶在線」的變量。這將是非常好的,但現在不在PHP中。

假設您使用的是默認的基於文件的會話處理程序,那麼您可以簡單地啓動一個腳本來掃描會話保存目錄中的會話文件,該會話文件比您的超時期限早,並基於此更新數據庫。 「如果會話文件大於30分鐘,則將用戶設置爲」登出「數據庫」。要做到這一點,你既可以在用戶的​​數據庫ID存儲在會話文件,並提取(會話文件都只是serialize()倒是的$_SESSION[]內容),或從文件名('sess_' . session_id()默認情況下),並使用提取會話ID是更新數據庫。

看不出這將是代碼的任何超過20個或30行,除非你有一個龐大的數據庫接口庫來處理。使用SPL DirectoryIterator,爲他們的'mtime'掃描文件是微不足道的。