2012-03-21 48 views
24

我用session_start()在PHP中啓動會話,但是當我的瀏覽器關閉時,會話不見了。如何在PHP中創建持久會話?

如何使用PHP創建跨瀏覽器關閉的持續會話?

+4

聽起來像一份餅乾工作 – 2012-03-21 02:43:04

回答

51

查看php.ini的值session.cookie_lifetime

默認值0表示在瀏覽器關閉時結束會話。

您可以直接在php.ini中覆蓋該值,也可以在使用ini_set開始會話之前將其設置在您的應用程序中。將其設置爲大於0的值將導致會話在該持續時間內存活。

E.g.

ini_set('session.cookie_lifetime', 60 * 60 * 24 * 7); // 7 day cookie lifetime 
session_start(); 

上述示例會導致會話cookie設置爲從會話啓動後7天到期。

注:如果你開始你的所有網頁從同一段代碼的會議,這將不會繼續延長會話過期每次session_start()被調用。 Cookie的使用期限是從會話第一次啓動時開始設置的,而不是隨後的請求。如果您想從當前時間起7天內延長會話的使用期限,另請參閱session_regenerate_id()

另請注意:如果您session.gc_maxlifetime值設置爲大於會話cookie的長度的東西少,你可以有一種情況,用戶不訪問該站點5天,當他們返回時,會話cookie不再有效,因爲服務器上的數據已被刪除。爲了解決這個問題,您還應該將此會話數據的生存期設置爲至少與您的Cookie生存期一樣長。正如手冊所述,可能需要使用自定義session.save_path來保存要保留的時間長於默認值的會話數據。因此,您的腳本可能如下所示:

ini_set('session.cookie_lifetime', 60 * 60 * 24 * 7); 
ini_set('session.gc_maxlifetime', 60 * 60 * 24 * 7); 
ini_set('session.save_path', '/home/yoursite/sessions'); 
session_start(); 
2

會話的設計使其基於「會話」。換句話說,如果你關閉了瀏覽器(這本質上是你的會話),它應該消失。

您可以嘗試將會話數據存儲在數據庫中而不是文件中。將會話ID和會話數據存儲在一個表中。然後從Cookie PHPSESSID中調用會話標識(默認情況下),並從數據庫中查找會話數據。

+1

將會話存儲在數據庫中將不會使會話持續,如果Cookie設置爲在瀏覽器關閉時消失...取決於您如何編程垃圾收集和銷燬方法可能會保存會話數據,但如果在瀏覽器關閉並重新打開後,maxlife設置爲0,則用戶將擁有新的會話數據和新的會話數據。 – Snowburnt 2014-01-27 12:09:00

2

如果您想要持續會話,我會推薦使用Cookie和數據庫。我們將客戶的ID(隨機32位字母數字值)存儲在一個cookie中,然後引用它來加載他們的客戶信息。

2

您可以在不輸入session_start()啓動會話,你可以用餅乾象這樣開始

setcookie('PHPSESSID','any id' , any time); 

,因爲當你鍵入session_start()可以這樣做,然後嘗試看看餅乾這樣

print_r($_COOKIE); 

那麼outpout將是:

Array ([PHPSESSID] => c0voj7h0b4aesddkc17a6jk7c3) 

只是自己試試