PHP會話超時


Answers

當會話到期時,數據不再存在,所以類似

if (!isset($_SESSION['id'])) {
    header("Location: destination.php");
    exit;
}

將在會話不再活動時重定向。

您可以使用session.cookie_lifetime設置會話cookie的活動時間

ini_set("session.cookie_lifetime","3600"); //an hour

編輯:如果您是由於安全考慮(而不是方便性)計時會議,使用接受的答案,如下面的評論顯示,這是由客戶端控制,因此不安全。 我從來沒有想到這是一個安全措施。

Question

我正在創建一個會話,當用戶登錄像這樣:

$_SESSION['id'] = $id;

我怎樣才能指定在X會議的會話超時,然後讓它執行一個函數或頁面重定向一旦達到X分鐘?

編輯:我忘了提到,我需要會議超時由於不活動。




Byterbit解決方案是有問題的,因為:

  1. 讓客戶端控件到期的服務器端cookie是一個安全問題。
  2. 如果服務器端設置的超時時間小於客戶端設置的超時時間,則頁面不會反映cookie的實際狀態。
  3. 即使為了開發階段的舒適,這也是一個問題,因為它不能在發布階段反映正確的行為(在時間上)。

對於cookies,通過session.cookie_lifetime設置過期是正確的解決方案設計和明智的安全! 為了使會話過期,您可以使用session.gc_maxlifetime。

通過調用session_destroy來終止cookie可能會產生不可預知的結果,因為它們可能已經過期。

使php.ini中的變化也是一個有效的解決方案,但它使整個域的到期全球可能不是你真正想要的 - 有些網頁可能會選擇保留一些cookie比其他更多。




<?php
session_start();
if($_SESSION['login'] != 'ok')
    header('location: /dashboard.php?login=0');

if(isset($_SESSION['last-activity']) && time() - $_SESSION['last-activity'] > 600) {
    // session inactive more than 10 min
    header('location: /logout.php?timeout=1');
}

$_SESSION['last-activity'] = time(); // update last activity time stamp

if(time() - $_SESSION['created'] > 600) {
    // session started more than 10 min ago
    session_regenerate_id(true); // change session id and invalidate old session
    $_SESSION['created'] = time(); // update creation time
}
?>



<script type="text/javascript">
window.setTimeout("location=('timeout_session.htm');",900000);
</script>

每個頁面的標題在現場測試期間一直在為我工作(該網站尚未投入生產)。 它所屬的HTML頁面結束會話,只是通知用戶需要重新登錄。 這似乎比玩PHP邏輯更容易。 我想對這個想法提出一些意見。 任何陷阱我沒有看到它?