如何在PHP中维护全局会话?

时间:2012-04-21 13:11:32

标签: php session

我目前正在使用PHP中的应用程序,我需要维护购物车。一切都运作良好。

当商品添加到购物车时,我需要在每个页面的标题上显示一条消息,例如“购物篮中的 1商品”,如果购物车包含一个项目。

当添加(或删除)其他项目时,邮件应相应更改而不刷新页面,例如“购物篮中的2个项目”等等。< / p>

我面临的问题是,当某些项目被删除或添加到购物车时我需要刷新页面(然后我才能看到页面标题上的更新项目

例如,假设购物车现在包含2个商品,现在添加了一个附加商品,标题上的消息仍然会在购物篮中显示“ 2个商品“而不是在购物篮中显示” 3个商品“,直到刷新页面为止。


在Java中,我们有SessionListener如下。

package sessionListener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener()
public class SessionListener implements HttpSessionListener
{
    private HttpSession session=null;        

    @Override
    public void sessionCreated(HttpSessionEvent se)
    {
        session=se.getSession();
        //Use this session            
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se)
    {

    }
}

我本来可以使用sessionCreated()方法来满足要求,因为这是在首次创建会话时只执行一次的方法。

同样在.NET中,我们有Global.asax应用程序文件,例如

<%@ Application Language="C#" %>

<script runat="server">

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {

    }

    void Application_Start(object sender, EventArgs e) 
    {
        // Code that runs on application startup

    }

    void Application_End(object sender, EventArgs e) 
    {
        //  Code that runs on application shutdown            
    }

    void Application_Error(object sender, EventArgs e) 
    { 
        // Code that runs when an unhandled error occurs

    }

    void Session_Start(object sender, EventArgs e) 
    {
        // Code that runs when a new session is started
        Session.Add("Message", SomeValue);            
    }

    void Session_End(object sender, EventArgs e) 
    {
        // Code that runs when a session ends. 
        // Note: The Session_End event is raised only when the sessionstate mode
        // is set to InProc in the Web.config file. If session mode is set to StateServer 
        // or SQLServer, the event is not raised.

        Session.Abandon();

    }

</script>

我本可以使用void Session_Start(object sender, EventArgs e)方法来满足要求,因为这是在会话开始时只调用一次的方法(每个用户会话一次)。

但是在PHP中,我找不到在创建新会话时只执行一次的类似概念(我现在没有在PHP中使用任何框架)。

如果是这样,那么在没有页面刷新的情况下更新购物车的状态时,如何在每页的标题上显示上述指定的消息?

3 个答案:

答案 0 :(得分:2)

要更改页面的一部分而不刷新,您将需要一种客户端语言。 Javascript可以帮助你,特别是对于AJAX调用:你调用一个PHP脚本,它返回购物车中的项目数。

即使用户在浏览器中打开多个标签,您也可以每X分钟调用一次以刷新项目数。

答案 1 :(得分:0)

您可以使用JavaScript的AJAX调用向服务器发出请求,而无需刷新页面。

但请注意,某些浏览器不支持(或禁用)JavaScript。因此,即使页面刷新,也要确保您的脚本仍然有效。

答案 2 :(得分:0)

正如我在一个项目中所做的那样:每次更改时,购物车会在两个位置更新:在服务器上和在加载的页面中,动态更新。

点击购物车项目的+/-按钮更改其数量会触发JavaScript事件,执行以下操作:

  1. 向服务器发出ajax call,让其知道购物车的内容已更改;
  2. 更新已加载页面中显示的购物车。
  3. 例如,看一下像jQueryMootools这样的JS库。他们使JS脚本比从头编写代码容易得多!还有很多其他类似的库。