2013-04-03 72 views
0

我在約35-40分鐘後會話變量變爲null時出現問題。但是,會話ID似乎仍然顯示爲有效(並且與以前相同)。約30分鐘後PHP會話變量爲空

我創建了一些測試代碼,它讀取並顯示會話變量,然後在越來越多的秒數後重新加載頁面。它一直運行到2400秒,此時顯示屏上的變量爲空。換句話說,它在刷新之間等待2400秒時總是爲空。我將.htaccess中的session.gc_maxlifetime設置爲7800(顯然這是因爲它使用ini_get讀取爲7800)。

我要麼失去了一些明顯的東西,要麼是一些嚴重的奇怪現象。這讓我瘋狂。

這是在帶有WHM的Linux VPS上。

代碼來創建測試會話:

<?php 
    // start session 
    session_start(); 

    // set session value 
    $_SESSION["session_memberid"] = 1234567; 
    $_SESSION["session_refresh"] = 2000; 

    // write file, close 
    session_write_close(); 

    // display confirmation 
    echo json_encode(array(
     '$_SESSION["session_memberid"]' => $_SESSION["session_memberid"], 
     'session_id' => session_id(), 
     'maxlifetime' => ini_get('session.gc_maxlifetime') 
    )); 
?> 

代碼讀取會話(自動重新加載):

<?php 
// start session 
session_start(); 

// get session id 
$session_id = session_id(); 

// get stored memberid 
$member_id = $_SESSION['session_memberid']; 
$_SESSION['session_memberid'] = $member_id; 

// get last activity 
$lastactivity = $_SESSION["last_activity"]; 

// increasing refresh time 
$refresh = $_SESSION["session_refresh"]; 
$_SESSION["session_refresh"] = $refresh + 100; 

// update time 
$_SESSION["last_activity"] = time(); 

// write file, close 
session_write_close(); 

... 
(code to display and refresh variables) 

輸出時有效的讀:

{"memberid":1234567,"session_id":"c9d20d4992f184f29b259ef5ccab275f","sessionpath":"\/tmp","maxlifetime":"7800","sessioncookiepath":"\/","sessioncookielifetime":"0","referrer":"","autostart":"0","cache":false,"time":1365004882,"cookie":{"lifetime":0,"path":"\/","domain":"","secure":false,"httponly":false},"refresh":2400} 

輸出時無效的讀取顯示memberid(我們需要的變量),時間(last_activity)和刷新時間爲空。

任何想法?

+0

另一個說明:我使用vi檢查了/ tmp目錄中的sess_文件。奇怪的是這個文件是空的(儘管vi給了我一個關於我沒有訪問權限的警告)。 – joshd

回答

0

事實證明,問題在於php.ini在運行時沒有被.htaccess或ini_set中的設置正確覆蓋,即使ini_get顯示值被覆蓋。原因尚不清楚,但工作的解決方法是簡單地更改php.ini中的session.gc_maxlifetime。

1

是否有可能apache用戶沒有寫入/ tmp目錄的權限,並且會話只在該時間段的ram中處於活動狀態。一旦從ram中刪除,它將默認爲該文件,因爲權限而永遠不會寫入該文件?

+0

現在看來,原因是缺少ini_set或.htaccess設置來覆蓋php.ini session.gc_maxlifetime設置。此設置已更新爲7800,現在它顯示會話變量保持不變。 vi中的空sess_文件是由於權限不允許它們被讀取/顯示。通過以root身份登錄來驗證內容。 – joshd