close

PHP中的session可以默認情況下是使用用戶端的Cookie(以便和普通意義上的Cookie區別,我稱之為session cookie,普通意義上的Cookie為Cookie)來保存session id的,但是PHP中的session是否只能使用session cookie呢?當然不是,否則何必還弄個session出來,不如直接用Cookie算了.Session的一大優點就是當用戶端的Cookie被禁用時會自動把session id附在URL中,這樣再通過session id就能記住session變數了.

下面我寫兩個檔來證實一下,首先在流覽器中設置禁用Cookie.

//檔案名為test1.php

session_start();

session_register("url");

$url="test2.php";

echo "goto test2.php

";

?>

//檔案名為test2.php

session_start();

if (session_is_registered("url")) {

echo "Congratulations.

";

$url="test1.php";

echo "goto test1.php

";

}

else echo "Failed.

";

?>

現在在流覽器中輸入"http://localhost/test1.php",把滑鼠移到鏈結上看看狀態欄上的位址,不是簡單的"http://localhost/test2.php",而是這種形式:"http://localhost/test2.php?PHPSESSID=6e3610749f7ded3784bc4a4dd10f879b".你還可以查看Html的原始檔案,原始檔案是這種形式:

goto test2.php

所以說這完全是PHP的功勞,和流覽器無關,也就是說無論你用什麼流覽器session都有效,而不是有的人認為的只對IE有用.

但是,我們的超鏈結是語句是由echo語句輸出的,如果超鏈結不包含在PHP的標籤 ?>之內會怎樣呢?還是寫個例子來驗證一下,把test1.php稍作修改:



session_start();

session_register("url");

$url="test2.php";

echo "goto test2.php

";

?>

(Html形式)goto test2.php

在流覽器中輸入"http://localhost/test1.php",分別把滑鼠移到兩個鏈結上看看有沒有不同?可以看到,兩個鏈結是完全相同的,後面都會自動附帶session id.所以不必擔心沒被包含在PHP標籤中的鏈結會失效,PHP不會這麼笨的.

但是在使用時要注意必須先用session_start()函數告訴PHP開始用session,哪怕你在這個檔中只有html代碼,如:

session_start();?>






gogogo

…………

記得有人說過這個優點只能在linux/unix下才能發揮出來,而我用的Win2000p+Apache1.3.17+Php4.0.4pl1,PHP為Apache模組方式,卻照樣可以.恰恰相反,我轉到linux下去測試時反而不行了.其實是在編譯時的一個選項--enable-trans-sid控制了這項功能能否有用.而按照PHP默認來編譯時是沒有打開這項功能的,只需重新編譯時加入它就可以了.我的配置為Apache1.3.17+Php4.0.4pl1,PHP為Apache模組方式,在linux重新編譯後用Netscape Navigator4.7測試可以通過(這更證明了和流覽器無關).

只靠session是不能跨視窗使用的,即使你啟用了Cookie,當你在一個視窗中有一個合法的session id(記錄在session cookie中,不是URL中),再新開一個視窗進入相同頁面時,你會重新擁有一個新的session id,而與前一個視窗互不影響.要想跨視窗使用同一個session id就只能在URL後指定session id,也就是說如果你把帶有session id的的視窗的URL複製,在新開的視窗中粘貼一下,還是照樣使用的.知道了session id的這個原理要實現跨視窗session還是不難的,可以把Cookie與session結合起來,首先取得當前合法的session id,然後把它記錄在Cookie中,在其他視窗讀取Cookie就可獲得當前的Session id了.具體實現我記得在phpuser上有一篇文章專門討論過.

最後再說一下:

①經常有人問到"為什麼copy你寫好的代碼,卻會出錯,你也太……",再把出錯提示拿來一看:

Warning: open(/tmpsess_eca1da208748db2e9c6bec1fccc182b4, O_RDWR) failed: m (2) in c:/www/test1.php on line 2

其實是他自己的問題:session存放的路徑/tmp不存在.有兩種辦法:一是在根目錄(一般是C:)建一個名為tmp的目錄;二是修改php.ini文件

session.save_path = /tmp ;

把/tmp目錄用絕對路徑指定一個目錄(當然必須存在),如我的php.ini中

session.save_path = G:PHPtempsession ;

②還有一種情況的出錯資訊為:

Warning: Cannot send session cache limiter - headers already sent (output started at

c:/www/test1.php:1) in c:/www/test1.php on line 2

這是因為你在用session_start()之前已經資料輸出到用戶端了,比如說Html標籤、文字甚至是空格都不行,所以最好在程式第一句就用session_start().

好了,說了這麼些,都是我親自試驗通過的,如果有不對的或不準確的地方歡迎討論(xcloudy@china.com).




arrow
arrow
    全站熱搜
    創作者介紹
    創作者 killworm737 的頭像
    killworm737

    紀錄些小事情

    killworm737 發表在 痞客邦 留言(0) 人氣()