2010-06-18 163 views
44

當用戶登錄時一樣,所以我創建一個會話:PHP會話超時

$_SESSION['id'] = $id; 

我怎麼能在X分鐘即會話指定超時,然後把它執行功能或頁面重定向一次它已經達到了X分鐘?

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

+9

的可能重複[我怎樣在30分鐘後到期PHP的會話?](http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-分鐘) – Kzqai 2012-03-06 19:12:46

回答

86

第一,存儲用戶最後一次在隨後的請求提出的要求

<?php 
    $_SESSION['timeout'] = time(); 
?> 

,檢查多久前,他們做了他們以前的請求(在這個例子中10分鐘)

<?php 
    if ($_SESSION['timeout'] + 10 * 60 < time()) { 
    // session timed out 
    } else { 
    // session ok 
    } 
?> 
+20

但是,如果您的PHPINI中的默認會話超時時間短於您的時間選擇。 默認情況下,超時通常少於一個小時。 如果您不希望客戶端控制超時,則需要將此代碼與session.cookie_lifetime的ini_set組合起來。 此答案也不處理客戶端刪除其Cookie的情況。 – Olhovsky 2012-07-27 11:32:27

+2

PHP默認爲'0',意思是:「在瀏覽器關閉之前」。如果瀏覽器刪除了這個cookie,'$ _SESSION ['timeout']'var就不會被設置在第一位。但是,我忽略了所有其他的會話管理,因爲這個問題只會詢問超時。 – Jacco 2012-09-08 09:50:24

42

當會話過期數據不再存在,所以像

每當會話不再活性
if (!isset($_SESSION['id'])) { 
    header("Location: destination.php"); 
    exit; 
} 

將重定向。

您可以設置會話cookie是多久活着使用session.cookie_lifetime

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

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

+1

你必須刪除$ _SESSION ['id']周圍的引號 – 2010-06-18 10:18:16

+0

即使你沒有投票答案,你的解決方案似乎更安全,我的問題是,你是否必須在每個頁面上設置會話超時?我想這是有道理的,因爲你會希望它每次重新啓動?其次,你是否必須爲每個頁面執行session_start來獲取會話數據,或者只需要一次就可以啓動它?謝謝 – nagates 2011-06-28 07:25:51

+10

會話cookie生命週期中存在一些問題,最值得注意的是,它依賴*客戶端*來執行它。 Cookie的使用期限是爲了讓客戶清理無用的/過期的cookies,它不會與任何與安全相關的問題混淆。 – Jacco 2011-07-08 12:01:04

0
session_cache_expire(20); 
    session_start(); // NEVER FORGET TO START THE SESSION!!! 
    $inactive = 1200; //20 minutes *60 
    if(isset($_SESSION['start'])) { 
$session_life = time() - $_SESSION['start']; 
if($session_life > $inactive){ 
    header("Location: user_logout.php"); 
} 
    } 
    $_SESSION['start'] = time(); 

    if($_SESSION['valid_user'] != true){ 
    header('Location: ../....php'); 
    }else{ 

來源:http://www.daniweb.com/web-development/php/threads/124500

+1

只是谷歌搜索你遇到的第一個答案,並將其粘貼到堆棧溢出不利於本網站的重點。此外,session_cache_expire()與會話的長度無關,因此您粘貼的答案有不正確的信息。 – 2013-04-23 15:37:46

+0

@DavidBradbury默認情況下,cookie存儲session_id,如果cookie過期,則session_id無法在客戶端請求時訪問。 – 2016-12-27 05:44:17

5

只是先檢查會議是不是阿雷dy創建,如果不創建一個。在這裏我只設置它1分鐘。

<?php 
    if(!isset($_SESSION["timeout"])){ 
    $_SESSION['timeout'] = time(); 
    }; 
    $st = $_SESSION['timeout'] + 60; //session time is 1 minute 
?> 

<?php 
    if(time() < $st){ 
    echo 'Session will last 1 minute'; 
    } 
?> 
2
<script type="text/javascript"> 
window.setTimeout("location=('timeout_session.htm');",900000); 
</script> 

在每一頁的頁眉中現場測試已經爲我工作(該網站是尚未製作)。它所屬的HTML頁面結束會話,並只是通知用戶需要重新登錄。這似乎比使用PHP邏輯更簡單。 我很想談談這個想法。任何陷阱我沒有看到它?

+4

並非所有人都使用js – chuckieDub 2013-06-04 19:29:22

+0

如果您使用同一站點打開了多個選項卡,則必須全部刷新才能創建一個活動,否則如果您繼續在1個選項卡中工作,其他人將在超時後顯示「timeout_session.htm」。非常令人沮喪,特別是如果「timeout_session.htm」未設置/銷燬會話。 =) – 2016-09-08 19:00:44

1
<?php 
session_start(); 

if (time()<$_SESSION['time']+10){ 
$_SESSION['time'] = time(); 
echo "welcome old user"; 
} 

else{ 
session_destroy(); 
session_start(); 
$_SESSION['time'] = time(); 
echo "welcome new user"; 
} 
?> 
0
<?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 
} 
?> 
+0

確保評論你的答案,並解釋你在哪裏以及如何添加超時。 – Rias 2015-04-21 21:20:19

1

Byterbit溶液是問題的,因爲:

  1. 具有服務器端的cookie的客戶端控制期滿是一個安全問題。
  2. 如果服務器端設置的過期超時小於客戶端設置的超時,頁面將不會反映cookie的實際狀態。
  3. 即使爲了開發階段的舒適性,這也是一個問題,因爲它不會在發佈階段反映正確的行爲(在時間上)。

用於cookie,通過session.cookie_lifetime設置過期是設計智能和安全智能的正確解決方案!爲了使會話過期,你可以使用session.gc_maxlifetime。

到期調用session_destroy,因爲他們可能已經過期,可能會產生不可預知的結果餅乾。

使php.ini中的變化也是一個有效的解決方案,但它使全球有效期爲這可能不是你真正想要的整個領域 - 某些頁面可能選擇保留一些餅乾比別人多。