2012-03-28 48 views
0

我有一個上傳表單,需要用戶約30分鐘。去完成。整個時間他們在這個頁面上閒置。我使用ini_set()函數。你可以在這裏看到上傳頁面的頂部:用戶會話不斷到期

<?php 

     session_start(); 
     ini_set('session.gc_maxlifetime',10080); 

    ?> 

如果用戶閒置30個以上的分什麼情況持續發生的。數據被截斷並且User_id被記錄爲NULL值。我完全不知道這是怎麼發生的。我最初在php.ini中設置了maxlifetime,但重載了緩存的會話數據。所以,我只是使用ini_set。爲什麼數據會被搞亂,並且user_id沒有被記錄。注意:如果您足夠快地完成表單,則不存在任何問題。

+0

其中user_id?你是否在會話中存儲數據,數據在30分鐘後消失? – 2012-03-28 21:01:19

回答

3

您應該在session_start()之前使用ini_set()

+0

等待,因爲它被放置的順序而被ini_set()忽略了嗎? – Graham 2012-03-28 21:04:13

+0

另外,ini_set()也會超出ob_star()嗎? – Graham 2012-03-28 21:10:39

+0

通常你把ini_set()放在文檔的最頂端 – Dion 2012-03-29 14:10:32

2

這是因爲還有另一個腳本,其值爲session.gc_maxlifetime,值約爲30分鐘。所以其他腳本的會話垃圾回收器會清除超時時間會話(從他們的角度來看,會話超時)。

解決辦法:你需要改變的session.gc_maxlifetime全球價值php.ini.htaccess或指定腳本相同(或至少較大)值。

+0

我在全局設置了它,並且每個頁面都有session_start()和站點崩潰。我有一個錯誤,基本上說有太多的緩存會話數據。 ini_set應該覆蓋默認的24分鐘。在我添加的頁面上? – Graham 2012-03-28 21:03:26

+0

我不知道這是共享主機的限制。但是,我已將它設置爲全球一天。這導致了網站每個頁面上有session_start()的錯誤。顯示用戶是否也登錄過錯誤。 – Graham 2012-03-28 21:06:59

1
  1. 設置session.gc_maxlifetimeini_set不一定對服務器清除會話的雙向作用。 例如,在Debian(並且,我想在其他一些系統上也可以),會話將被一個cron作業清除,該作業不受腳本內部任何配置的影響(它只讀取全局php.ini設置)。 如果是這樣的話,你可以在php.ini中增加這個服務器範圍。

  2. 您可以覆蓋session save handler,然後用會話有效期自己處理......

  3. 你可以使用一些AJAX調用保活,這樣即使用戶是窗體頁上的空閒也有一些是「會說話」到服務器在到期時間內保持會話活躍