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";
?>
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的源文件,源文件是这种形式:
所以说这完全是php的功劳,和浏览器无关,也就是说无论你用什么浏览器session都有效,而不是有的人认为的只对ie有用.
但是,我们的超链接是语句是由echo语句输出的,如果超链接不包含在php的标签 ?>之内会怎样呢?还是写个例子来验证一下,把test1.php稍作修改:
session_start();
session_register("url");
$url="test2.PHP";
echo "goto test2.php";?>
@L_404_6@
…………
记得有人说过这个优点只能在linux/unix下才能发挥出来,而我用的win2000p+apache1.3.17+PHP4.0.4pl1,PHP为apache模块方式,却照样可以.恰恰相反,我转到linux下去测试时反而不行了.其实是在编译时的一个选项--enable-trans-sid控制了这项功能能否有用.而按照PHP默认来编译时是没有打开这项功能的,只需重新编译时加入它就可以了.我的配置为apache1.3.17+PHP4.0.4pl1,在linux重新编译后用netscape navigator4.7测试可以通过(这更证明了和浏览器无关).
只靠session是不能跨窗口使用的,即使你启用了cookie,当你在一个窗口中有一个合法的session id(记录在session cookie中,不是url中),再新开一个窗口进入相同页面时,你会重新拥有一个新的session id,而与前一个窗口互不影响.
要想跨窗口使用同一个session id就只能在