2015-06-25 45 views
2

我有這個函數來跟蹤用戶會話時間。關於session_start()的致命錯誤

function sessionTracker(){ 
    ini_set('session.cookie_lifetime', 86400); 
    ini_set('session.gc_maxlifetime', 86400); 
    $sid = session_id(); 
    if ($sid != '') { 
     //echo "Session exists!"; 
    } else { 
     //echo "No current session exists! Starting..."; 
     session_start(); 
    } 

    if(!isset($_SESSION['username'])) 
    { 
     header("location:login.php"); 
     exit(); 
    } 

但我發現了一個「30秒超過了最大的執行時間」,當它擊中的session_start();線。有沒有更好的功能,或者我該如何解決這個問題?我一直都不明白,但總是那樣。

function sessionReup() { 
    $time = $_SERVER['REQUEST_TIME']; 

    //for a 30 minute timeout, specified in seconds 
    $timeout_duration = 1800; 

    /* 
     Here we look for the user’s LAST_ACTIVITY timestamp. If 
     it’s set and indicates our $timeout_duration has passed, 
     blow away any previous $_SESSION data and start a new one. 
    */ 
    if (isset($_SESSION['LAST_ACTIVITY']) && ($time -  $_SESSION['LAST_ACTIVITY']) > $timeout_duration) { 
     session_unset(); 
     session_destroy(); 
     session_start(); 
     header("location:login.php"); 
     exit(); 
    } 

    /* 
    Finally, update LAST_ACTIVITY so that our timeout 
    is based on it and not the user’s login time. 
    */ 
    $_SESSION['LAST_ACTIVITY'] = $time; 
} 
+0

嘗試增加的max_execution_time在php.ini –

+0

但如果增加時間,不增加時間的頁面將加載?那麼用戶會等待更長的時間? – moe

+0

是的,但如果頁面需要加載時間,那麼我們應該給它。並非所有頁面都需要很長的執行時間 –

回答

0

該代碼沒有顯示一行,這可能會導致運行時間過長。 會話存儲在硬盤上。該設備真的很慢嗎? 您是否交換過會話處理程序?

但是你可以在你的代碼簡化爲:

session_start(); 

if(!isset($_SESSION['username'])) 
{ 
    header("location:login.php"); 
    exit(); 
} 
+0

這是我的原始代碼。 '的ini_set('會話。cookie_lifetime',86400); ini_set('session.gc_maxlifetime',86400); session_start();如果(!isset($ _ SESSION ['用戶名'])) header(「location:login.php」); exit(); }' – moe

+0

該設備字面上是2周齡。其全新的IBM AS/400。 – moe

+1

你是否在做多個請求?你在用阿賈克斯嗎?也許你正在運行會話鎖定問題。會話文件被請求鎖定爲exlusive。同一個會話的下一個請求將等到超時或直到我獲得會話文件訪問權。 –

0

我想我找到了問題所在。在ajax調用中,我調用了具有舊代碼的php頁面,因爲它是舊代碼,我從未更新過這些頁面。罪魁禍首,

if(!isset($_SESSION)){ 
    session_start(); 
}