PHP跨頁面SESSION丟失問題

不少人在PHP的開發中會出現SESSION跨頁面丟失的問題,我曾經也遇到過,可是他本身好了 ^_^. php

今天特別看了下,這種狀況通常是用header跳轉後才發生的,結合了PHP手冊和網上的一些文章,作一下總結: session

1.第一種狀況是由於COOKIE丟失, COOKIE不可用的致使的。因爲sessionId是保存到客戶端的,跳轉到頁面的時候COOKIE取不到, sessionId丟失,SESSION也就丟失了。這種狀況國內文章流行的解決辦法是在跳轉先後的兩個頁面的session_start()後面都加上session_id(SID);爲何加這個會有用呢?查看官方手冊,對函數session_id()的描述是獲取或者設置當前SESSION的ID。SID是一個常量,文檔的描述是:The constant SID can also be used to retrieve the current name and session id as a string suitable for adding to URLs。不太明白這是什麼意思,咱們姑且把他當成一個惟一的字符串。在跳轉以前的頁面使用session_id(SID);就是把當前的sessionId設置爲常量SID。跳轉後頁面再次使用session_id(SID), sessionId就存在了,並且和以前頁面的SID同樣,有了sessionId,就能夠獲取到session。 函數

對於這種狀況,還有一種作法,就是在跳轉的URL裏面把sessionId加上去。在一些網站上能看到相似 ?PHPSESSID=xxxxxxx的URL,這就是手動加sessionId。代碼應該是: 網站

sesstion_start(); ui

$sessionId = session_id(); google

$url = '1.php?PHPSESSID='.$sessionId; url

header('Location:' . $url); ip

這種作法沒試過,原理知道了,解法能夠有多種。 開發

2.若是上面的你都試過了,session仍是丟失,國內的文章基本都是讓你加session_id(SID)。這個時候改用google搜搜國外的文章了。PHP SESSION有一個函數:session_write_close();不看這個函數還不知道一些東西。這個函數的做用是:寫入session數據保、存而且結束session。在該函數的描述中說到:Session data is usually stored after your script terminated without the need to call session_write_close()。session數據「一般」是在腳本結束才保存數據,除非你調用了session_write_close(),有點坑爹。若是上面的方法沒有解決,極可能是在你跳轉以前SESSION沒有保存,那麼就須要在header以前調用session_write_close();而且在header以後加上一個exit(0);以保證腳本結束。這樣有了雙重保障,由於看到有人使用了session_write_close();之後仍是丟失了,最後在header()後面加了exit(0)才解決問題的。 文檔

可是有時候咱們沒有加session_write_close();也沒有exit(0);爲何session是正常的呢?這個地方很疑惑,不知道是否是除了 「session數據‘一般’是在腳本結束才保存數據」當中所說的一般之外的狀況,但願有人高人能幫忙看看。

相關文章
相關標籤/搜索