2012-06-18 46 views
1

我正在使用基於java的上傳構造http://www.javaatwork.com/java-upload-applet/details.html,我試着在夜間運行。session.gc_maxlifetime是否指定自上次更改單個會話變量以來的最長生命週期?

  1. 它基本上存儲在服務器的硬盤驅動器上的所有內容(在/ var/WWW /私營/ $用戶id)
  2. 確保數據良好,形成
  3. 然後它傳遞到永久存儲(亞馬遜S3 )。

步驟1完成後,我運行下面的代碼:

if($_SESSION['userId']) 
    {//Makes sure that data is well-formed} 
else 
    {echo 'you are not logged in';} 

我試圖運行這四個小時才發現you are not logged in打印到屏幕。

下面是CGI的php.ini文件中的相應指令(我使用Ubuntu 12.04與Apache2的。)

session.gc_probability = 0 
session.gc_divisor = 1000 
session.gc_maxlifetime = 14400 //this is 30 hours, which is far greater than the 4 hours it was running 
session.cache_expire = 1800 
session.cookie_lifetime = 0 

大多數這些指令與例外的默認session.gc_probabilitysession.gc_maxlifetime

我試圖解決這個問題,並遇到了一個真正有用的博客傑夫從中我推斷,瀏覽器可以導致存儲在瀏覽器中的PHPSESSID cookie被刪除,如果瀏覽器內的網站從一段時間內不活動發生。他建議

「在瀏覽器中創建一個後臺JavaScript進程,向服務器發送定期檢測信號。重新生成一個新的cookie,例如每5或10分鐘一次。 http://www.codinghorror.com/blog/2008/04/your-session-has-timed-out.html

所以我決定這樣做。

function myTimeoutFunction() 
{ 
    $.ajax({ 
     url: "heartbeat.php",      
     success: function() { 
     } 
    }); 
    setTimeout(myTimeoutFunction, 15*60*1000); 
} 
myTimeoutFunction(); 

heartbeat.php <?php session_start(); ?>

我要測試這個用於上載應採取〜4小時。不過,我剛剛看了以下

一般來說,你可以說session.gc_maxlifetime指定因爲您的會話數據的最後一個變化最大壽命(最後一次在session_start叫)

https://stackoverflow.com/a/1516338/784637

如果我有3個會話變量,$_SESSION['userId'] $_SESSION['firstName'] $_SESSION['lastName'],我會需要在heartbeat.php

session_start(); 
$_SESSION['userId'] = $_SESSION['userId']; 
$_SESSION['firstName'] = $_SESSION['firstName']; 
$_SESSION['lastName'] = $_SESSION['lastName']; 
他們所有的值重置0

或者我可以重置一個值

session_start(); 
$_SESSION['lastHeartbeat'] = time(); 

讓其他三個會不會過期?

回答

3

PHP會話保持爲一個整體; $ _SESSION中的任何更改都會更新更改時間,並通過擴展來保留整個會話。

關於實際問題:PHP不應該在達到最大時間之前進行GC會話,但這並不意味着PHP始終將其清除。默認情況下,會話保存在/ tmp(或另一個)目錄中,一些Linux發行版將擁有cron作業,可以清理文件夾。檢查cron或其他可以清除會話的獨立於PHP的東西。

+2

+1。我將補充一點,避免會話文件被其他進程或具有不同gc設置的其他php腳本所擦除的一種好方法是通過設置'session.save_path'將它們保存到一個僻靜的非web訪問目錄中 – goat

+0

@rambocoder - 會只是爲'session.save_path'指令設置一個不同的路徑來防止那些「其他進程」?我將如何去確定這些流程可能是什麼? – user784637

+1

是的,它會工作。我不知道如何找到這些進程 - 我不是一個系統管理員,但我想你可以設置哪些進程記錄哪些進程調用stat()或unlink()其他os級別的調用,參與gc過程。但是,除了清理tmp文件夾的cron作業之外,可能的罪魁禍首是其他php腳本在同一個共享Web服務器上調用具有不同配置的session_start()。 – goat

相關問題