2016-12-29 90 views
0

我在這裏是一個難題。我有一個使用Google OAuth的應用程序,需求是增加用戶保持登錄的時間。使用PHP增加登錄會話

在由前端控制器(index.php)調用的腳本開始處,有一條if語句檢查是否存在全局變量$ _SESSION。

if(!isset($_SESSION)) @session_start(); 

這很好,因爲我可以看到登錄用戶的會話數據。現在我不知道如何解決這個問題,因爲在會話中保存的谷歌令牌數據也碰巧有一個值爲3299(一小時)的expires_in鍵。

我的分析是,一小時後從谷歌會話超時,並控制這樣,它擴展我應該看看更新代碼,通過谷歌認證到離線刷新令牌。我並不確定這個原因,因爲我至少可以在應用程序中控制會話的超時時間 - 我遇到的問題是如何部分。 。

下面的代碼片段,我寫的正上方@session_start電話:

if(isset($_SESSION)){ 
    $sessionKeys = array(key1, key2,key3); //Keys that are destroyed on logout 
    $refreshLifetime = false; 
    foreach($sessionKeys as $key){ 
     if(!empty($_SESSION[$key]){ 
     $refreshLifetime = true; 
     } 
    } 

    if($refreshLifetime){ 
     @setcookie(session_name(), session_id(), time() * 3600); 
    } 
} 

東西感覺不對這個代碼的處理會話用PHP有可能是所有的複雜性與不同如何一起工作系統會將PHP上的會話添加到該客戶端和服務器端會話處理中。

有人可以幫我提出一個想法,我可以解決這個問題,使應用程序可以有一個擴展的會話說5小時才超時?

編輯

我已經決定了應用程序會話保存路徑從/var/lib/php5移動到應用程序本身的目錄。我通過將session.gc_maxlifetime設置爲10分鐘來開始,看看我是否會被鎖定或重定向到登錄頁面,但我不是。

我加入,即使我還在猶豫閱讀enter link description here後和第一用戶音符貢獻似乎沒有使用高速緩存與gc_lifetime到期鏈接的cache_expire設置。

如果我把它放在這裏,它應該和我爲session.gc_maxlifetime設置的一樣嗎?

ini_set('session.save_path', __DIR__ .'/../tmp'); 

ini_set('session.gc_maxlifetime', 300); 

ini_set('session.gc_probability', 1); 
ini_set('session.gc_divisor', 100); 

session_cache_limiter('private'); 
session_cache_expire(300); 

然而,正如我所期待的應用程序在5分鐘沒有動作之後被重定向到登錄頁面這沒有奏效。有沒有我丟失的東西,這個代碼是在調用session_start的文件的頂部。

+0

謝謝瑞安。我們的工作基於Scrum,對我來說這聽起來像是一個新功能。我可以提出這個建議,但與此同時,這個想法是將會話時間延長到X小時,而不是延長用戶白天的時間。儘管我已注意到你的建議。 – Maximum86

回答

1

您有兩個gc-maxlifetimecache_expire會話配置,您可以使用它們來影響該行爲。

請勿使用setcookie函數來執行此操作。

+0

謝謝我會做一些谷歌搜索,看看我的問題是否得到解決。 – Maximum86

+0

我已經用您的建議更新了我的問題,在我指定了10分鐘並將其減少到5的時間之後,我似乎沒有將其踢出去,僅用於測試目的。介意讓我對此有更多的瞭解?我如何最好地使用gc-maxlifetime和cache_expire? – Maximum86

+0

在哪個操作系統上運行此應用程序?某些linux服務器禁用了使用'session.gc_maxlifetime'和使用cronjob進行清理的功能。 – Dekel