2012-04-02 48 views
1

我在我的網站中遇到了困擾我好幾個月的這個問題。我一直在繞過它,但現在我似乎無法找到這樣的方式,所以我想明白爲什麼不解決根本問題?會話變量對於某些用戶而言消失(drupal)

我的根本問題是,有時(並不總是)會話數據對於一些用戶的消失。我知道他們中的大多數肯定會啓用cookies。我想也許這是一個會議屆滿的事情,但我不認爲就是這樣。我設置過期很長時間,加上他們的會話被擦除的用戶量是太該死的高...

我使用Drupal的6

有什麼建議?

+0

任何代碼?如果我們有合作的話,這將有所幫助。 – MichaelRushton 2012-04-02 08:14:05

+0

代碼? <?php echo $ _SESSION ['notworking'];?>什麼也沒有顯示 – 2012-04-02 08:29:41

+0

在會話頁面頂部是否有'session_start()'? – MichaelRushton 2012-04-02 08:30:40

回答

0

在腳本的頂部添加ob_start()session_start();

+0

它是一個Drupal站點。會話變量通常被存儲。但有時他們消失 – 2012-04-03 07:15:05

3

幾樣東西,你可能要檢查

  1. 如何會話垃圾收集器,配置?請驗證PHP設置:session.gc_maxlifetime,session.gc_divisor,session.session.gc_probability。這只是一個猜測,但也許GC正在刪除你的數據。
  2. 數據是否從會話表中消失?如果您爲Drupal使用默認會話處理程序,$ _SESSION表的數據以序列化形式存儲在會話表的會話列中。
  3. 如果數據從數據庫中滅亡,如果你能夠開發服務器上重複的問題,您還可以啓用查詢日誌記錄數據庫(MySQL的服務器配置,請參閱http://dev.mysql.com/doc/refman/5.1/en/query-log.html瞭解詳細信息)。啓用devel模塊後,您可以使用註釋修飾(devel模塊設置)查詢,包括有關函數執行查詢的信息。這可能會幫助你找到問題。 不要試圖對生產環境
  4. 有時問題可以通過啓用的模塊之一,它削弱你的$ _SESSION表所致。嘗試在啓用的模塊代碼中查找所有$ _SESSION事件,特別是在寫入上下文中。一些正則表達式將有助於完成此任務。
+0

+1 - 我的錢在GC上。人們很少意識到,如果增加會話生存期,還需要修改GC會話最大生存時間。 – Leigh 2012-04-16 11:43:35

+0

嘗試將session.gc_maxlifetime設置爲200萬,並未解決問題。 – 2012-04-17 20:56:37

+0

點2)呢?您是否驗證了會話表對於有報告問題的用戶的行爲? – harijari 2012-04-19 06:42:55

0

我猜了一下這裏,有點我認爲這可能是你的問題/解決方案:

簡短的回答:嘗試在網站設置session.cookie_lifetime /默認/ settings.php配置爲0

長答案:會話取決於服務器上的會話數據客戶端上的PHP會話cookie。如果您將會話Cookie生存期設置得太低(Drupal默認爲23天,所以通常不是問題),則會話可能會在客戶端被「銷燬」(通過瀏覽器刪除cookie,因爲它已過期)。

我曾在同一時間,因爲我改變了Drupal的會話cookie的生命23天的東西比在試圖限制登錄時間出於安全原因,顯得比較「合適」遇到這個問題。但降低會話cookie生存期並非解決方案。這樣做的最好方法是限制服務器端的會話持續時間。你可以通過設置session.gc_maxlifetime(也可以在Drupal設置中)爲7200(2小時)。然後,您只需確保會話垃圾回收運行得足夠頻繁,以便會話在2小時後可靠地結束。

然後,以避免問題的cookie被銷燬的客戶端,您可以session.cookie_lifetime設置爲0。這將確保只要用戶在網站上,只有當他保持不活動的時間超過session.gc_maxlifetime時,他纔會被註銷。最重要的是,當他關閉瀏覽器時,它還會記錄用戶輸出。默認情況下,Drupal沒有做到這一點!

ESSENTIAL UPDATE:爲什麼將cookie生存期設置爲0是一個好主意?因爲否則,服務器將客戶端需要的日期/時間設置爲EXPIRE cookie。 那麼,你可能會說什麼?那麼,考慮一下這種情況:如果客戶端的時鐘設置錯誤(是的,它確實發生了,即使大多數計算機通過NTP更新他們的時間,有些則不會)!它可能會很快過期,然後你認爲即使到達即將到期。 這是確切的問題,我不得不一次調試...

所以儘量cookie生存0至少一次,如果您遇到奇怪的問題,會議:)

+0

我不明白。你是說沒有設置cookie的壽命過低,但將其設置爲0?我沒有得到它。現在它已被設置爲200萬。我不希望在關閉瀏覽器時將用戶註銷 – 2012-04-17 21:03:24

+0

太低我的意思是太低,即不要將時間跨度設置的太低。 0 ==無窮大或瀏覽器關閉時。但我只注意到我忘了提到一些必要的東西,我會更新我的帖子。 – hopla 2012-04-18 07:35:34

+0

請閱讀有關客戶端時鐘設置的更新。這可能是你的問題(或者服務器時鐘設置)。 – hopla 2012-04-18 07:44:47

0

我覺得你的問題是與會話保存路徑

其中.PHP放置請創建您的根目錄,即域名(搭配chmod 777 MUST)的文件夾,並把這個代碼

if(!is_writable(session_save_path())){ 
    session_save_path(dirname(__FILE__)."/<xyz>"); 
} 

啓動會話之前。

還有一件事情發生在使用文件而不是內存進行會話設置時。

+0

我真的不明白。我應該如何命名目錄?爲什麼這個工作? – 2012-04-17 20:59:07

+0

聽好了,前一陣子我已經走了這個錯誤,這幫助我消除了這個錯誤。現在如果你將這段代碼放在index.php中,那麼你已經創建了一個文件夾,它位於index.php所指向的文件夾內,並且必須使它可以被腳本寫入才能工作。 – 2012-04-18 05:38:11

0

我曾經有過類似的問題,原因是着名的www。

該網站已啓用通過www.example.com和example.com訪問,這些網站一直運行良好,直到用戶點擊一個鏈接,該鏈接使用oposit域名進行硬編碼。然後,他切換域/子域和Apache/PHP在「新」域上爲用戶創建了一個新會話。當人們從付款中歸還時,這特別令人討厭。

我們的解決方案是始終強制用戶僅使用example.com,並禁用或將所有請求直接重定向到www.example.com直接發送到example.com。通過這種方式,你永遠不會在兩者上都獲得會話

+0

我有重定向到www – 2012-04-17 20:57:03

0

我聽說過某個特定PHP版本的Drupal session_regenerate_id()問題。你可以嘗試禁用這個功能並測試它嗎?

+0

我該如何禁用它? – 2012-04-17 20:57:20

+0

你可以註釋掉「session_regenerate_id();」在user.module中。如果PHP版本是4.1或4.4,則會報告此問題。你有哪個PHP版本? – 2012-04-18 06:49:50