[英]PHP session randomly expires
開始我想解釋一下我想要完成的事情。 所以我有一個系統,如果用戶登錄,他們的用戶名將存儲在$_SESSION['username']
。 在每個頁面上我都有session_start();
然后我經常檢查if(isset($_SESSION['username']))
來顯示不同的東西。
這一切都很有效,除了會話在超時之前到期,或者$_SESSION['username']
變量在超時之前未設置,導致系統認為用戶需要注銷。 我真的想補充一點,這是隨機發生的!
我可以在網站上花10分鍾,互動間隔不同,沒有任何事情發生,接下來我知道,我在3分鍾內被踢了兩次。
我可以驗證session.cookie_lifetime = 0
(這意味着它將在瀏覽器關閉之前不會過期)和session.gc_maxlifetime = 1200
(這沒關系,因為我已將會話保存文件夾設置在不同於TMP)。
我可以想到的唯一問題可能是問題,一旦驗證密碼,登錄部分中的代碼就是:
$_SESSION['username'] = $usernameInput;
session_write_close();
header("Location: index.php");
我知道使用header意味着會話變量不會被保存,因為它會刪除文檔,但這就是我使用session_write_close();
保存這些變量。 請記住:此后一切正常! 一旦到達index.php,我就可以看到我的用戶名。
有一些SO線程導致用戶將會話變量和內容保存在數據庫中,但我寧願修復它而不必這樣做。
編輯:所以我重新引入了一個函數來計算會話超時,這是有效的,但我已經發現了。 我查看了瀏覽器的network
部分,在XHR
我查找會話和cookie以及其他內容。 網站對我的logout.php
文件發出GET請求時會發生奇怪的事情。
所以我看看可能導致這種情況的原因。 我有兩個注銷按鈕,由PHP回應,我給了他們每個不同的href鏈接。 我把它縮小到這個PHP和HTML。 上次我檢查時,HTML不會自動轉到它的代碼中的href。 而且我懷疑PHP會這樣做。
if(isset($_SESSION['username'])){
echo "<div class='navProfile navButton'><img class='navProfileIcon' src='images/angerypigeon.jpg' alt=''><h3 class='navProfileUsername'>" . $_SESSION['username'] . "</h3><h3 class='navProfilePosts'>Posts: 102</h3><a class='navProfileLogout' href='php_tools/logoutbutton2.php'>Logout</a></div>";
echo "<button class=\"modalButton upload navButton\" id=\"uploadButton2\" type=\"button\" name=\"button\" style=\"margin-left: auto\">Upload</button>";
}
else {
echo "<button class='navButton' type=\"button\" name=\"button\" onclick=\"location.href = 'login.php'\">Login</button>";
}
當我在瀏覽器中檢查我的XHR字段時,它會發送logoutbutton2
的GET請求。 我怎樣才能防止這種情況發生? 我自己沒有點擊按鈕。 它隨機發送。
由於我無法查看我只能推測的所有代碼。 有什么可能在“隨機”中殺死會話。
也許你有:
首先,檢查請求標頭中是否正確設置了SET-COOKIE
。 檢查生命周期(客戶端)。
有時未正確創建有關用戶會話的文件。 檢查session_save_path
並檢查此文件夾是否有新文件。
這個問題似乎已經解決了。 它真的是一個隨機和不可預測的事情..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.