Session是否必須依賴Cookie
發(fā)表時(shí)間:2024-06-18 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Session是否必須依賴Cookie?www.ouryh.net銀河技術(shù)在線║整理時(shí)間:2001-8-7║作者: 不詳 ║來(lái)源: 不詳 ║閱讀:36 PHP中的session可以默認(rèn)情況下是使用客戶端的Cookie(以便和普通意義上的Cookie區(qū)別,我稱之為session cookie,普通...
Session是否必須依賴Cookie?
www.ouryh.net銀河技術(shù)在線║整理時(shí)間:2001-8-7║作者: 不詳 ║來(lái)源: 不詳 ║閱讀:36
PHP中的session可以默認(rèn)情況下是使用客戶端的Cookie(以便和普通意義上的Cookie區(qū)別,我稱之為session cookie,普通意義上的Cookie為Cookie)來(lái)保存session id的,但是PHP中的session是否只能使用session cookie呢?當(dāng)然不是,否則何必還弄個(gè)session出來(lái),不如直接用Cookie算了.Session的一大優(yōu)點(diǎn)就是當(dāng)客戶端的Cookie被禁用時(shí)會(huì)自動(dòng)把session id附在URL中,這樣再通過(guò)session id就能記住session變量了.
下面我寫兩個(gè)文件來(lái)證實(shí)一下,首先在瀏覽器中設(shè)置禁用Cookie.
<? //文件名為test1.php
session_start();
session_register("url");
$url="test2.php";
echo "<a href=$url>goto test2.php</a>
";
?>
<?//文件名為test2.php
session_start();
if (session_is_registered("url")) {
echo "Congratulations.
";
$url="test1.php";
echo "<a href=$url>goto test1.php</a>
";
}
else echo "Failed.
";
?>
現(xiàn)在在瀏覽器中輸入"http://localhost/test1.php",把鼠標(biāo)移到鏈接上看看狀態(tài)欄上的地址,不是簡(jiǎn)單的"http://localhost/test2.php",而是這種形式:"http://localhost/test2.php?PHPSESSID=6e3610749f7ded3784bc4a4dd10f879b".你還可以查看Html的源文件,源文件是這種形式:
<a href="test2.php?PHPSESSID=6e3610749f7ded3784bc4a4dd10f879b">goto test2.php</a>
所以說(shuō)這完全是PHP的功勞,和瀏覽器無(wú)關(guān),也就是說(shuō)無(wú)論你用什么瀏覽器session都有效,而不是有的人認(rèn)為的只對(duì)IE有用.
但是,我們的超鏈接是語(yǔ)句是由echo語(yǔ)句輸出的,如果超鏈接不包含在PHP的標(biāo)簽<? ?>之內(nèi)會(huì)怎樣呢?還是寫個(gè)例子來(lái)驗(yàn)證一下,把test1.php稍作修改:
<?
session_start();
session_register("url");
$url="test2.php";
echo "<a href=$url>goto test2.php</a>
";
?>
<a href="test2.php">(Html形式)goto test2.php</a>
在瀏覽器中輸入"http://localhost/test1.php",分別把鼠標(biāo)移到兩個(gè)鏈接上看看有沒有不同?可以看到,兩個(gè)鏈接是完全相同的,后面都會(huì)自動(dòng)附帶session id.所以不必?fù)?dān)心沒被包含在PHP標(biāo)簽中的鏈接會(huì)失效,PHP不會(huì)這么笨的.
但是在使用時(shí)要注意必須先用session_start()函數(shù)告訴PHP開始用session,哪怕你在這個(gè)文件中只有html代碼,如:
<? session_start();?>
<html>
<head>
<body>
<a href=test2.php>gogogo</a>
…………
記得有人說(shuō)過(guò)這個(gè)優(yōu)點(diǎn)只能在linux/unix下才能發(fā)揮出來(lái),而我用的Win2000p+Apache1.3.17+Php4.0.4pl1,PHP為Apache模塊方式,卻照樣可以.恰恰相反,我轉(zhuǎn)到linux下去測(cè)試時(shí)反而不行了.其實(shí)是在編譯時(shí)的一個(gè)選項(xiàng)--enable-trans-sid控制了這項(xiàng)功能能否有用.而按照PHP默認(rèn)來(lái)編譯時(shí)是沒有打開這項(xiàng)功能的,只需重新編譯時(shí)加入它就可以了.我的配置為Apache1.3.17+Php4.0.4pl1,PHP為Apache模塊方式,在linux重新編譯后用Netscape Navigator4.7測(cè)試可以通過(guò)(這更證明了和瀏覽器無(wú)關(guān)).
只靠session是不能跨窗口使用的,即使你啟用了Cookie,當(dāng)你在一個(gè)窗口中有一個(gè)合法的session id(記錄在session cookie中,不是URL中),再新開一個(gè)窗口進(jìn)入相同頁(yè)面時(shí),你會(huì)重新?lián)碛幸粋(gè)新的session id,而與前一個(gè)窗口互不影響.要想跨窗口使用同一個(gè)session id就只能在URL后指定session id,也就是說(shuō)如果你把帶有session id的的窗口的URL復(fù)制,在新開的窗口中粘貼一下,還是照樣使用的.知道了session id的這個(gè)原理要實(shí)現(xiàn)跨窗口session還是不難的,可以把Cookie與session結(jié)合起來(lái),首先取得當(dāng)前合法的session id,然后把它記錄在Cookie中,在其它窗口讀取Cookie就可獲得當(dāng)前的Session id了.具體實(shí)現(xiàn)我記得在phpuser上有一篇文章專門討論過(guò).
最后再說(shuō)一下:
①經(jīng)常有人問到"為什么copy你寫好的代碼,卻會(huì)出錯(cuò),你也太……",再把出錯(cuò)提示拿來(lái)一看:
Warning: open(/tmpsess_eca1da208748db2e9c6bec1fccc182b4, O_RDWR) failed: m (2) in c:/www/test1.php on line 2
其實(shí)是他自己的問題:session存放的路徑/tmp不存在.有兩種辦法:一是在根目錄(一般是C:)建一個(gè)名為tmp的目錄;二是修改php.ini文件
session.save_path = /tmp ;
把/tmp目錄用絕對(duì)路徑指定一個(gè)目錄(當(dāng)然必須存在),如我的php.ini中
session.save_path = G:PHPtempsession ;
②還有一種情況的出錯(cuò)信息為:
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
這是因?yàn)槟阍谟胹ession_start()之前已經(jīng)數(shù)據(jù)輸出到客戶端了,比如說(shuō)Html標(biāo)簽、文字甚至是空格都不行,所以最好在程序第一句就用session_start().
好了,說(shuō)了這么些,都是我親自試驗(yàn)通過(guò)的,如果有不對(duì)的或不準(zhǔn)確的地方歡迎討論(xcloudy@china.com).