经过实验发现,PHP4的session只对当前打开的浏览器窗口有效(至少在W2K下的IE5和NS6中是这样)。
实验步骤:
   首先我们来建立两个文件。
test1.php 
<?php
session_start(); 
session_register("count"); 
echo $count=0; 
?> test2.php 
<?php
session_start(); 
echo $count++; 
?>   然后为了避免不必要的影响我们清空浏览器的cache,打开两个浏览器窗口,在第二个浏览器的窗口中执行test1.php,这时我们应该看到浏览器中显示的值是0。继续在第二个浏览器的窗口中执行test2.php,并不断的刷新它,我们就会看到浏览器中的数值在不断的递增,这说明我们的session是起作用的。我们继续看看其他的情况,先在第一个浏览器的窗口中执行test2.php,没有显示继续刷新,仍没有显示。我们再打开第三个浏览器窗口并在其中执行test2.php,也是没 
有显示,这说明session不能跨窗口运行。
  那么怎么才能让session可以跨窗口执行呢?我们一起来继续我们的实验。
  首先,我们来看看使用cookie的情况,同样建立两个文件。
test3.php 
<?php
setcookie("cookie","This is a cookie.",time()+3600,"/","www.md.hl.cn"); 
?> test4.php 
<?php
echo $cookie; 
?> 
然后我们仍然利用刚才打开的三个浏览器的窗口,先在第二个窗口中执行test3.php。没有任何显示,然后我们在三个窗口中分别执行test4.php,都会显示This is a cookie.这说明使用cookie是可以跨窗口执行的。
  我们怎么才能让session跨窗口执行呢?其实session也在cookie中保存了session_id(不过session也可以不使用cookie,但这不在本文的讨论范围)。这个cookie的名字与你在php.ini中的session.name的设置有关,缺省时叫"PHPSESSID"。但在IE的cache中却找不到。你可以通过echo $HTTP_COOKIE_VARS["PHPSESSID"]来查看它的值,当然也可以通过setcookie()来设置它。PHP4中可以使用session_set_cookie_params()和session_get_cookie_params()来设置和查看session的cookie设置。但我试了一下不起任何作用,session仍然是关闭浏览器窗口就失效,仍然不能跨窗口运行。我想也许是我调用的方法不对,麻烦那位高手知道给指点一下。
  最后,我们来继续完成我们的实验。这次要修改我们的文件test1.php
test1.php 
<?php
session_start(); 
session_register("count"); 
setcookie("PHPSESSID",session_id(),time()+3600,"/","www.md.hl.cn"); 
echo $count=0; 
?>  然后我们再来重复我们的实验一,哈哈,这次session可以跨窗口使用了吧,并且关闭浏览器session也不会马上失效,上例中的session应该是1小时后失效,但在做实验二时,我吧3600改成120,查看IE的cache,此cookie是2分钟后到期,但不停的刷新test4.php发现实际$cookie这个变量存在的时间却只有大约6秒中,不知道到底是怎么回事。:(麻烦那位高手知道给指点一下。
  后记:这篇文章的所有程序是在Solaris 2.6,PHP 4.0.0,Apache 1.3.12下测试并通过的。 
但写完这篇文章以后我又在Windows 2000 Advanced Server,PHP 4.0.1pl2,IIS 5.0测试了一 
遍,发现PHP 4.0.1pl2中的session可以跨窗口运行,而且也可以用用session_set_cooie_params()设置session cookie的失效时间。所以我想上面的问题也许只是PHP 4.0.0的一个bug, 唉,又要升级服务器的软件了。:(

解决方案 »

  1.   

    session.timeout[=nMinutes]的默认值是20分钟,也就是20分钟之后,该session就会自动终止.
    你可以自己设置适当的时间.下面是session对象的全面介绍Session对象
      该对象在ASP使用中占相当大的比例。由于网页是一种无状态程序,无法得知用户浏览状态。在ASP中,通过Session对象来记录使用者私有的数据变量,以作为用户再次对服务器提出要求时做确认,用户在程序的Web页面之间跳转时,存在Session对象中的变量将不会消失。  这些真的是很重要的功能,尤其是有会员的系统必须要用到的。像是会员的登入账号、时间、状态以及许许多多该记录的实时数据(如购物系统记录使用者的购物篮内的商品),这些信息属于各使用者私人所需要,通常开发者都是使用 Session 记录处理。  在ASP中的Session是使用Cookies构成,服务器将所有的Session内记录的数据,以Cookies的方式传至用户的浏览器。通常一般浏览器会将这些Cookies存起来,每当使用者点选连结,再次与服务器做联机时,浏览器就会把这些Cookies传回Server供做处理:这即是 Session的运作原理。由此可知会话状态Session仅在支持cookie的浏览器中保留,如果客户关闭了Cookie 选项Session也就不能发挥作用了。  一、Session.SessionID
       SessionID 属性返回用户的会话标识。在创建会话时,服务器会为每一个会话生成一个单独的标识,会话标识以长整形数据类型返回。在很多情况下 SessionID 可以用于 WEB 页面注册统计。  利用该属性可以解决一种对用户的控制问题。该问题的主要功能就是,针对某个网站的一个模块,当一个会员登录后正在看此模块时,另一个人用同样的会员名登录,就不能浏览这个模块:也就是说一个会员名同时只能一个人浏览此模块。  通过用会员名(假设为UserID,唯一)和SessionID来实现了控制。当会员登录时,给这个会员一个Session记录登录状态如: Session("Status")="Logged",同时把这个会员的Session.SessionID写入数据库。当他要浏览此模块时,先判断其是否登录,若已经登录再判断它的SessionID是否与数据库记录的相同,如果不同则不能访问。  这样,当另一个用户用相同的会员名登录时,那么数据库中记录的就是新的SessionID,前者访问此模块时就不能通过检查。这就实现了一个会员名同时只能一个人浏览某个模块。这个功能在一些收费网站有很有特别作用,它防止了一个会员名给多个人浏览的问题,为公司保障了利益。
    <%=Session.SessionId%>是单独生成的唯一ID标识,可刷新调试。  二、Session.TimeOut
      该属性设置的Session的最大间隔时间。间隔时间是指客户器端从最近一次向Web服务器提出要求,到下一次向Web服务器提出要求的时间。可以理解为:如果用户在该超时时限之内不刷新或请求网页,则该会话将终止。Timeout 属性是以分钟为单位,为该应用程序的Session对象指定超时时限的,一般默认为20分钟。这在网吧等公共场所,登录个人信息页而忘记关闭窗口时,显得比较重要(至少可以把时间设短些)。
    <%=Session.TimeOut=10%>  以上SessionId、TimeOut属于Session对象的两个属性,下面看该对象的一个方法Abandon  三、Session.Abandon
      该方法是Session对象的唯一方法,可以清除Session对象,用来消除用户的Session对象并释放其所占的资源。当然你如果没有明确调用 Abandon方法,一旦会话超时,服务器也会将删除这些对象并释放资源。
       下面就用两个页的程序来认识Session对象以及Abandon方法的利用。  1.login.asp<%
    '是提取url中变量loginout的值是否为true,若为真,就执行Session.Abandon()。
    if Request.QueryString("loginout")="true" then
          Session.Abandon()
    end if'只有在当点击了submit按钮的前提下,再来判断提取的东西都不为空,则建立Session对象。
    submitname=request.form("submit1")
    if submitname="submit" then
       if Request.Form("name")<>"" and Request.Form("pwd")<>"" then
          Session("name")=Request.Form("name")
          Session("pw")=Request.Form("pwd")
       end if
    end if
    %>
    <%
    '如果Session("name")不为空,则显示Session("name")的值,并且做一个到info.asp的链接。
    if Session("name")<>"" then
    response.write("你的name值是:"&Session("name"))
    response.write("<br><a href='info.asp'>显示你的资料</a>")
    else'否则,即Session("name")为空不存在,则显示表单用以输入建立Session的平台。
    %>
    <form action="login.asp" method="post">
    姓名:<input type="text"???? name="name"><br>
    密码:<input type="password" name="pwd"><br>
    <input type="submit" value="submit" name="submit1">
    </form>
    <!--同样做了一个到info.asp的链接。-->
    <a href="info.asp">显示你的资料</a>
    <%end if%>  注意Session("name")为空和不为空的时候,都做了一个到info.asp的链接,具体调试结果如何,再来看info.asp的内容。   2.info.asp<%
    '如果session对象值为空则跳转到login.asp
    if session("name")="" then
       Response.Redirect("login.asp")
    '否则就显示个人信息
    else
       Response.Write("你的姓名:"&session("name")&"<br>")
       Response.Write("你的密码:"&session("pw")&"<br>")
    end if
    %>
    <a href="login.asp">返回</a>
    <a href="login.asp?loginout=true">退出</a>  可以看出来,info.asp页面内容的显示其实是需要条件的。那就是必须得有一个session值的存在,这样才可以显示具体的信息。这在登录系统中运用得比较多。  你可以把login.asp想象成一个登录窗口,当然我的这个比较简单(只要输入用名和密码就生产Session了),实际情况是:判断输入的用名和密码是否和数据库中的用名和密码吻合,如果正确吻合才生成Session的。然info.asp页面的作用刚好可以做为一权限页面,因为进入该页需要 Session,而Session的产生是确保用名密码正确的。  所以当一开始出现表单窗口时,你点login.asp链接是打不开的,只有当提交了表单生成了Session后才能进入。这正是登录系统的精髓所在, Do You Know?:)  四、Session_OnStart
       Session_OnStart属于Session对象的一类事件。它是在服务器创建新会话时发生的。服务器在执行请求的页之前先处理该脚本。 Session_OnStart 事件是设置会话期变量的最佳时机,因为在访问任何页之前都会先设置它们。  对象的例程每一次启动时触发Session_OnStart事件,然后运行Session_Onstart事件的处理过程。也就是说,当服务器接收到应用程序中的URL的HTTP请求时,触发此事件,并建立一个Session对象。  当然说到Session_OnStart事件就不能不谈到一个文件Global.asa(P.S:我打算把该文件和Chat程序放在一起说的,所以现在先不作过多解释)
       具体用法先透露,写在Global.asa文件内部
    <SCRIPT RUNAT=Server Language=VBScript>
    .......
    Sub Session_OnStart
    .......
    End Sub
    .......
    </SCRIPT>  五、Session_OnEnd
      一看也就知道是Session对象的另一类事件了。当调用Session.Abandon方法时或者在TimeOut的时间内没有刷新,这会触发 Session_OnEnd事件,然后执行里面的脚本。同样具体用法在后面将写的Global.asa文件专题中详细介绍到,简单语法如下:
    <SCRIPT RUNAT=Server Language=VBScript>
    .......
    Sub Session_OnEnd
    .......
    End Sub
    .......
    </SCRIPT>以上就是对Session对象的系统学习。