2012-09-26 169 views
14

我的在線測試管理系統有一個奇怪的問題。如何保持會話活着而不重新加載頁面?

測試表單(test.php)中的一些用戶需要很長時間來回答問題並提交表單。

提交表格的會話過期,用戶必須重新登錄

這不是一個代碼問題

ini_set('session.gc_maxlifetime', 18000); 

所有頁面的頂部設置這個值後是否有如何刷新會話evrey 10分鐘無需重新加載測試表單中的頁面以防止會話過期?

請幫我

感謝

+0

可能會做一些ajax調用?你能再描述一下你的劇本嗎?可能有些代碼示例會有所幫助:) – Gogol

+0

有趣。我正在處理類似的問題,但我對此事的看法是,應該避免自動重置會話超時,因爲這會有效地創建一個無限的會話,只要瀏覽器窗口打開就會持續。相反,我建議你的最大生命週期應該增加,超時可以根據用戶的操作進行刷新。即使鼠標移動也可以做到這一點,一旦鼠標移動就啓動一個計時器。除非包含某些用戶交互組件,否則會造成較大的安全漏洞。會話旨在過期。 –

回答

25

您可以使用JavaScript XHR,或其他稱呼它,AJAX。

使用Ajax,你可以調用PHP腳本,刷新您的會話每隔10分鐘。 :)


這是就我可以去「確切」。

的JavaScript

var refreshSn = function() 
{ 
    var time = 600000; // 10 mins 
    settimeout(
     function() 
     { 
     $.ajax({ 
      url: 'refresh_session.php', 
      cache: false, 
      complete: function() {refreshSn();} 
     }); 
    }, 
    time 
); 
}; 

refresh_session.php

<?php 
session_start(); 

// store session data 
if (isset($_SESSION['id'])) 
$_SESSION['id'] = $_SESSION['id']; // or if you have any algo. 
?> 

無論如何,另一個解決辦法是隻能用 解決這裏提出

延長了測試頁的會議時間

How do I expire a PHP session after 30 minutes?

+0

我需要更多的幫助,你能給我的確切代碼? –

+1

更新了我的回答:) – sheeks06

+8

在PHP腳本中,是不是'session_start()'只夠用了? –

9

所有你需要的是這樣的(用了jQuery的$。員額):

的JavaScript(把這個你的onload功能或裏面的東西)

setInterval(function(){$.post('path/to/refresh_session.php');},600000); //refreshes the session every 10 minutes 

refresh_session.php

<?php 
    session_start(); 

    if (isset($_SESSION['token'])) { //if you have more session-vars that are needed for login, also check if they are set and refresh them as well 
    $_SESSION['token'] = $_SESSION['token']; 
    } 
?> 

(我知道這跟接受的答案差不多,我真的想評論那個但我還沒有足夠的聲望。
最大的變化是在JavaScript中,你不需要一個完整的功能,只需要一行。)



額外的信息:

雖然我認爲這是不夠的,只是叫session_start()在PHP中,如果我沒有理解錯的(http://nl3.php.net/function.session-start):

讀回調將檢索任何現有會話數據(以 特殊序列化格式存儲),並將被解序列化並用於 autom當讀取的 回調將已保存的會話數據返回到PHP會話處理時,將原樣填充$ _SESSION superglobal。

在測試過程中,我只將上述代碼放在我的訪問者頁面上,而不是在管理頁面上。但是我在同一個瀏覽器(Chrome)中打開了兩個頁面,並且管理頁面也保持登錄狀態,至少在一個多小時內(不再檢查)。 ,但我不知道它是否仍然有效,如果你只使用session_start(),沒有在所有手動刷新任何會話-VAR ..

無論哪種方式,我想肯定的是,會話瓦爾我需要真的還在那裏:)

+0

您的「額外信息」似乎並非如此。我有同樣的問題。爲服務器創建一個ajax調用(ping/pong),以保持會話的活躍。每5分鐘測試一次。無論如何,大約2個小時後我都會被取消認證。現在試着改變會議。 –

+0

@FlipVernooij「會話改變方法」是如何去的? –