2013-03-14 97 views
1

session變量$_SESSION['']的範圍是什麼?如果我有一堆網頁調查串在一起,一個接一個,session variable會在一段時間後過期,或者只要您不關閉瀏覽器就會存在?如果你休眠你的電腦會發生什麼?php start_session()的範圍是什麼?

冬眠後,我似乎已經失去了一個會話變量,我不確定這是否是問題或者是否存在其他問題。

+0

據我所知,如果你有所有的網頁會話開始,沒有會話破壞,除非你關閉瀏覽器,否則不應該結束會話 – 2013-03-14 19:19:04

+1

你可能會發現[這個問題](http://stackoverflow.com/questions/1516266 /多久會我會議 - 最後)有用嗎? – ajp15243 2013-03-14 19:21:04

+0

是否需要在每個頁面上或每個想要實際使用會話變量的頁面上啓動會話?我沒有在每一頁上,但它似乎繼續傳遞(直到我的休眠問題等)。 – user1015214 2013-03-14 19:22:15

回答

2

會話作爲一個整體(而不僅僅是單個變量)可以繼續或丟失,原因很多。

在默認配置中,當瀏覽器關閉時,會話意味着「丟失」,因爲瀏覽器將刪除識別會話的cookie。它仍然在服務器上的某個地方,直到會話垃圾收集刪除它。因此,瀏覽器長時間處於空閒狀態可能仍會丟失會話,因爲PHP會刪除最近未使用的瀏覽器。

檢查the configuration。特別是,如果您需要保持較長時間的會話,則可能需要根據需要調整「session.gc_maxlifetime」和「session.cookie_lifetime」。

1

會話變量不會過期。 會話session_gc.maxlifetime and other configuration options爲限。

會話不受限於瀏覽器。但是,瀏覽器可能會選擇不將所需的信息發送到服務器,以便服務器恢復先前的會話。這通常發生在瀏覽器將所有Cookie當作會話cookie時發生。

在此上下文中,術語會話cookie並不意味着保存會話標識符或會話變量的cookie。相反,只要瀏覽器關閉(即瀏覽器前面的用戶會話結束),Cookie就會消失。

+0

我在哪裏以及如何設置session_gc.maxlifetime?我正在某人的服務器上運行一個程序,並且無法訪問php.ini文件。 – user1015214 2013-03-14 19:41:29

+0

使用['ini_set()'](http://www.php.net/manual/en/function.ini-set.php)。 – Oswald 2013-03-14 20:25:27

1

上取決於:

  • 的cookie的有效期,0應該意味着「直到瀏覽器關閉」,但Firefox/Mozilla瀏覽器傾向於把它(因爲他們的「恢復會話」功能)作爲'永遠'(這是恕我直言一個安全問題,所以你應該收到一個空的會議陣列重新生成你的ID)。所以:依賴於用戶代理。
  • 過期會話的配置垃圾回收。請注意,您可以讓網絡服務器處理這個問題(清理舊數據的百分比變化),這使得它有點不可預知。然而,一些軟件包(例如Debian上的PHP)只是使用cronjob來刪除過時的會話,如果您的自定義session.gc_maxlifetime設置由於另一個服務器範圍的設置而被忽略,那麼可能會造成嚴重破壞。

換句話說,如果您的UA決定保留cookie,並且沒有流程決定刪除數據,那麼您的會話仍然存在。這要求您瞭解UA和服務器的設置。