2012-11-06 73 views
0

我的腳本創建一個新的PHP會話,並立即將用戶重定向到另一個頁面。在第一次登錄嘗試時會導致PHP會話失敗的原因是什麼?

除了服務器閒置一個小時左右之後的第一次以外,每次都能正常工作。在第二次嘗試之後,它再次完美地工作。服務器空閒後,它總是失敗,並在第一次嘗試後始終工作。

編輯 當服務器空閒時,會話不起作用。之後一切正常。

理論上,什麼會導致會話在第一次嘗試時失敗?

我不想在此發佈任何代碼,因爲這只是因爲我不知道要發佈的代碼的哪一部分。這是使用PHP 5.3的IIS 7。同樣的結果都使用CGI和FastCGI。

編輯 session_start();在這兩個腳本上都被調用。當用戶立即重定向到下一頁時,用戶將看不到第一頁。腳本之間不到一秒鐘。

+0

我不得不說這是一個編碼/邏輯錯誤,如果沒有看到代碼就無法真正回答 - 但可以做出很多猜測。 – newfurniturey

+0

當你說「*服務器已經閒置了一個小時左右*」,這是否意味着你在瀏覽器中加載網頁,讓它在* 1小時左右*嘗試登錄之前? – newfurniturey

+0

我與@newfurniturey:顯示一些代碼,我的第一個猜測是你試圖訪問'$ _SESSION'超全球,但你的會話已過期。顯示一些代碼,並告訴我們你試過了什麼 –

回答

1

PHP會話有超時(如果我正確理解你的問題),這意味着他們將在超時後「重置」。

可以在php.ini文件檢查session.gc_maxlifetime :)

如果我沒有正確的理解,那麼它可能是在代碼本身的錯誤。

+0

如果你不想編輯服務器上的ini文件,你也可以在'htaccess'文件中使用'php_value session.gc_maxlifetime'。 – James

+2

在我看來,會話超時在應用於OP的聲明時並不真正有意義。他說,用戶第一次嘗試登錄時不起作用,這表明會話是* new *;當然,我也對他的「服務器閒置」聲明感到困惑,所以誰知道。 – newfurniturey

+0

__「除了第一次服務器閒置一個小時之後,這種工作完美無缺」__ - 服務器空閒後第一次失效。這句話引起我相信這可能是超時問題。 – Prash

2

會話存儲在磁盤上。由於沒有任何活動,您的服務器磁盤可能正在旋轉。然後,您的腳本在磁盤完成旋轉之前超時。可能?

+0

感謝您的建議。我試過了。不幸的是,這並沒有解決問題。我認爲這可能與不能及時將會話寫入磁盤有關(整個過程不到一秒鐘) – Tom

0

我的腳本創建一個新的PHP會話,並立即將用戶重定向到另一個頁面。

我理解你的話的意思是:第1頁你正在運行session_start()header('Location: 'page2.php')但在第2頁在我看來,你不會再這樣做session_start()

您需要在每個將使用的頁面上使用session_start()$_SESSION。換句話說,將session_start()放置在所有PHP頁面的頂部,或放在您計劃在每個頁面上運行的包含文件中。

0

回答我自己的問題。事實證明,這是由其中一個包含模塊中的舊「特徵」引起的。這個「功能」的目的是通過調用session_destroy()來結束會話,如果會話已經打開了一個多小時。

這導致了當用戶嘗試登錄時,PHP會注意到一箇舊會話並調用session_destroy()。在這之後,一切似乎都沒有問題,但是沒有新的會話變量可以寫入會話。沒有跡象表明PHP日誌中存在問題。

將session_destroy更改爲session_unset解決了問題。

相關問題