2011-06-15 130 views
19

如何設置PHP的會話生存期?我希望只要請求存在就將其設置爲永久。請求是AJAX。該處理AJAX請求我的PHP代碼:如何設置會話的生存期

// AJAX.php 
<?php  
session_start(); 

$_SESSION['counter'] = $_SESSION['counter'] + 1; 

header('Content-type: application/json');  
echo json_encode(array('tick' => $_SESSION['counter'])); 
?> 

和JavaScript:

$(document).ready(function() {    
function check() { 
    getJSON('ajax.php');   
} 

function getJSON(url) {         
    return $.getJSON(
       url, 
       function(data) { 
        $("#ticker").html(data.tick); 
       } 
      ); 
} 

setInterval(function() { 
    check(); 
}, 10000); // Tick every 10 seconds 

}); 

會議總是後經過300秒重置。

回答

31

PHP上的會話使用Cookie類型會話,而在服務器端,會話信息會不斷刪除。

對於設置在PHP中的時間的生活,你可以使用函數session_set_cookie_params中,在session_start前:

session_set_cookie_params(3600,"/"); 
session_start(); 

對於離3600秒爲一個小時,2小時3600 * 2 = 7200

但是它是會話cookie,瀏覽器可以自行過期,如果你想節省大量的時間會話(如記住登錄),你需要將數據保存在服務器和客戶端的標準cookie。

你可以有一個表 「會話」:

  • SESSION_ID INT
  • session_hash VARCHAR(20)
  • session_data是文本

和驗證一個Cookie,你救了「會議ID「和」hash「(用於安全),並且可以將會話的數據保存在服務器端,例如:

在登錄:

setcookie('sessid', $sessionid, 604800);  // One week or seven days 
setcookie('sesshash', $sessionhash, 604800); // One week or seven days 
// And save the session data: 
saveSessionData($sessionid, $sessionhash, serialize($_SESSION)); // saveSessionData is your function 

如果用戶返回:

if (isset($_COOKIE['sessid'])) { 
    if (valide_session($_COOKIE['sessid'], $_COOKIE['sesshash'])) { 
     $_SESSION = unserialize(get_session_data($_COOKIE['sessid'])); 
    } else { 
     // Dont validate the hash, possible session falsification 
    } 
} 

顯然,保存所有會話/餅乾電話,發送數據之前。

+2

這似乎是一個簡單問題的過於複雜的解決方案。在配置或.htaccess文件中設置session.cookie_lifetime的值有什麼問題?您建議的方式在每個需要會話的PHP文件中都需要額外的代碼。 – 2011-06-15 17:45:30

+0

是的,但我寫了簡單的解決方案(之前「但它......」),其餘或響應是「我想永久設置它」,嘿,session.cookie_fifetime,是服務器端配置,但瀏覽器將其作爲「會話cookie」進行管理。對於簡單的解決方案也可以使用session_set_cookie_params。 – Exos 2011-06-15 19:29:47

+0

很明顯,我使用的會話是保存每10秒更改一次的大數據,只要存在ajax請求即可。這是我需要永久設置它的方式。順便說一句,很好的回答謝謝 – brian 2011-06-16 06:09:52

-2

只要用戶不刪除他們的cookies或關閉他們的瀏覽器,會話應該保持存在。

+5

事實並非如此!一點也不。服務器端**和** cookie的會話都將過期。 – bytecode77 2016-03-26 08:21:13

2

會話可以在您的php.ini文件或您的.htaccess文件中配置。看看PHP session documentation

你基本上想要做的是在php.ini中尋找session.cookie_lifetime行,並使其值爲0,這樣會話cookie在瀏覽器關閉之前是有效的。如果您無法編輯該文件,則可以將php_value session.cookie_lifetime 0添加到.htaccess文件中。