我在使用PHP的網站,我在哪裏的用戶正在幾分鐘後退出運行工作的問題(具體時間有所不同,但它是足夠頻繁是一個問題),不管是否他們一直在積極使用該網站。PHP會話過期早
困難的是,我不能重現這個問題,如果我登錄,使用相同的瀏覽器我沒有得到登出,這表明它是不是網站被徹底打破的情況下,同樣的用戶。不幸的是,我不能訪問用戶機器來運行任何流量嗅探軟件。
我已經檢查的事情是:
- ,讓用戶在嘗試不同的瀏覽器。這似乎無法解決問題,因爲我無法指定客戶使用哪種瀏覽器,因此這不是一個長期解決方案。
- 服務器時間正確,符合用戶機器。
- 用戶Apache運行時具有寫入會話文件夾的權限,我可以看到正在創建的會話文件及其修改時間正在更新。
- 沒有使用輸出緩衝功能。
- 問題發生在各種頁面上,這些頁面似乎沒有任何共同之處(即不是它們都使用AJAX,或更新數據庫或其他原因)。
- 用戶只從一臺機器上訪問他們的帳戶,即他們不這樣做一點工作,對他們的筆記本電腦,切換到桌面,然後不知道爲什麼他們已經退出對他們的筆記本電腦(我們不允許多個同時登錄同一用戶)。
PHP中的會話設置是Debian的默認設置,並且在.htaccess文件或其他任何地方都沒有更改過。主要的有:
session.cookie_lifetime 0
session.gc_divisor 100
session.gc_maxlifetime 1440
session.gc_probability 0
session.save_handler files
session.save_path /var/lib/php5
session.use_cookies On
的Debian通過cron作業刪除而不是使用PHP的垃圾收集器,這就是爲什麼gc_probability設置爲0,我們正在運行的PHP版本的會議:PHP 5.2.6-1 + lenny13與Suhosin-Patch 0.9.6.2(cli)(Lenny的最新版本,我們將盡快升級到Squeeze,但我不認爲這是問題的原因)。
我們使用Zend_Session來管理會話,並在每個頁面上創建一次Zend_Session_Namespace的實例,從而自動調用在session_start()。會議由調用Zend_Session :: destroy()方法的退出頁面上清除,所以唯一的辦法用戶應該退出是:
- 如果他們明確地點擊註銷鏈接(我們會記錄發生這種情況時,並沒有關係瀏覽器預取頁面並將用戶登錄出去似乎不是這種情況)。
- 如果他們離開會話閒置超過24分鐘,此時的Debian可能會刪除他們的會話(有它運行每半小時刪除已未修改在24分鐘內的所有會話cron作業)。
- 如果他們關閉瀏覽器,因爲他們的會話cookie的過期時間爲0將被刪除。
用於查看用戶是否登錄的檢查有:
- 他們有一個有效的會話(通過看我們是否可以訪問$ zsession-檢查> USER_ID)。
- 會話表中有一行具有匹配的用戶標識和會話標識,並且這是在不到一小時前更新的最後一次。我們在註銷時刪除此行,以便即使會話仍然存在於磁盤上,任何人都無需登錄即可訪問該帳戶。
任何人都可以推薦其他的東西,我可以嘗試嗎?
編輯:一些額外的東西根據意見,我已經試過離開:
- 設置session.cookie_domain:這似乎是在PHP中有着很奇怪的行爲。如果我沒有設置此變量並將其保留爲「'(空字符串)的默認值,那麼www.domain.com的請求將生成www.domain.com的cookie。但是,如果我將cookie_domain設置爲'www.domain.com',則Cookie的域名爲'.www.domain.com'(注意前導點,這意味着對www.domain.com下方的所有內容均有效,例如subsite.www .domain.com)。
- 設置session.cookie_lifetime:PHP似乎沒有更新每個請求的到期時間,所以如果我將cookie_lifetime設置爲3600,cookie將在用戶第一次訪問該站點後一小時過期,即使他們登錄並不斷使用它。
編輯2:基於其它東西的人都問:
- 該網站是在數據中心託管,在一個單獨的VLAN。沒有人訪問該網站與該網站位於同一網絡上。
- 沒有使用IP身份驗證,也沒有在會話過程的任何部分使用客戶端的IP地址(例如,我們不會將會話附加到IP地址,並在用戶的下一個請求來自不同的IP)。
上次我有類似的問題,我錯過了在某個PHP文件中正確處理會話(所有其他文件都可以)。結果是,用戶試圖離開某個頁面後會話失效,因此他在不同類型的分鐘之後註銷,具體取決於他何時導航到頁面。不要將此視爲解決方案。把它看作是一個暗示,你可以找出一些錯誤。祝你好運! ^^ – Marco
時區(或服務器時間錯誤)在某些情況下可能會導致問題。 – Smar
@Smar它可以但我明確地說'服務器時間是正確的,符合用戶機器'。 – pwaring