2013-02-07 60 views
0

我正在使用PHP和MySQL爲我的網站製作一個會話系統。這個想法是,如果用戶會話不活動,用戶會話將持續大約5分鐘,並且CronJob會每隔一段時間運行一次,並檢查會話是否過期,如果是,則刪除會話。修改來自不同PHP會話的變量

問題:

每次有人加載它們的頁面有檢查數據庫,看看他們的會話仍然有效。我想知道是否在該CronJob任務中,我可以讓它找到用戶PHP會話並更改像$_SESSION['isValidSession']這樣的變量並將其設置爲false

所以一旦他們加載頁面,它只是檢查如果該會話是有效的變量。

對不起,對文本的牆!

TL; DR:我想修改不同指定會話的會話變量。

謝謝。

+1

爲什麼不簡單地將最後一次請求的時間存儲在會話存儲中並將其與每個請求中的當前時間進行比較? – Yogu

+0

@Yogo因爲這個會話數據需要被其他人無法訪問的頁面訪問。 我想問題的確是:「你如何得到一個特定的會話並修改它的變量。」 – MichaelMitchell

回答

1

每次有人加載它們的頁面有檢查數據庫,以 看看他們的會話仍然有效。我想知道是否在該CronJob 任務中,我可以使其找到用戶PHP會話並更改 變量,如$ _SESSION ['isValidSession']並將其設置爲false。

無論如何你都必須這樣做。當用戶加載他們的頁面時,系統必須驗證數據庫中的會話是否存在(我假設您使用的是數據庫)。

如果你每分鐘運行一次cron作業,並且超過五次的所有會話過期(這看起來相當過分?如果我正在閱讀一個長頁面,我經常在站點上停留五,十,甚至十五分鐘),這會自動「標記無效」(實際上刪除)會話。

通常情況下,您應該保留一個TIMESTAMP列,該列的最後一次更新時間(意思是會話)和cron作業時間戳的時間戳早於五分鐘以前的所有行都會保留。重新加載頁面時,系統將不再找到相關的會話行,並且(正確地)推斷出會話已過期。

但是,你想要什麼(讀會話知道它的SessionID)可以通過由cron作業的會話閱讀來完成(你可以編寫PHP中的工作)或者加載作爲現存會議賦予它的ID,或通過讀取包含SELECT SessionData FROM SessionTable WHERE id = 'SessionId';的序列化數據的DB列並對其進行反序列化。然後修改膨脹的對象,重新序列化並用SQL UPDATE將其存儲回數據庫。嘿presto!,會話現在已被修改。

但請注意,這可能會導致活動客戶端的併發問題,並且無法在SQL中一舉完成 - 您無法直接執行UPDATE Sessions SET isInactive = 1 WHERE expiry...。通常情況下,您需要逐一讀取感興趣的行,對其進行反序列化並將其存儲回來,並使用PHP代碼處理它們。

您可以間接使用兩種不同的解決方法。

一,您將您的會話代碼更改爲使用未序列化的數據。這會影響可維護性和性能(你不能「僅僅添加」某個會話的東西:你必須爲它創建一個列)。

二:利用序列化形式的事實,「0」和「1」具有相同的長度。也就是說,含isValidSession(14個字符的名稱),序列化會議將包含文本

...{s:14:"isValidSession";b:1;}... 

,你可以改變的那段繩子與{s:14:"isValidSession";b:0;},從而使isValidSession成爲False。這不是特別好的做法 - 你搞亂了系統的內部。當然,我不認爲任何人都希望PHP的序列化數據語法很快就會改變(......或者他們會這樣做嗎?)。

+0

嗯,所以PHP會話數據存儲在MySQL?你可以用它的ID選擇一個單獨的會話並修改它的序列化數據。似乎有點工作,看起來很簡單的任務。我想我只會檢查用戶是否從當前數據庫有效登錄。 謝謝你的努力! – MichaelMitchell

+0

等等,我假設你已經改變了會話設置,因爲你正在談論數據庫。 PHP會話默認存儲在*文件*中。 – LSerni

0
<?php var_dump($_SESSION); ?> 
+0

這隻適用於特定會話處於活動狀態的頁面。 – MichaelMitchell

0
  1. ,可以儲存在數據庫中的用戶的最後一個請求的時間。
  2. 在cornjob中,您應該檢查用戶上次查看時間並與當前時間進行比較,然後檢查哪個用戶時間已過期。
  3. 然後將過期用戶的數據庫列更新爲false。
  4. 之後,您可以通過檢查數據庫中的該colmn輕鬆地找出哪個用戶應該註銷。