每次有人加載它們的頁面有檢查數據庫,以 看看他們的會話仍然有效。我想知道是否在該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的序列化數據語法很快就會改變(......或者他們會這樣做嗎?)。
爲什麼不簡單地將最後一次請求的時間存儲在會話存儲中並將其與每個請求中的當前時間進行比較? – Yogu
@Yogo因爲這個會話數據需要被其他人無法訪問的頁面訪問。 我想問題的確是:「你如何得到一個特定的會話並修改它的變量。」 – MichaelMitchell