【问题标题】:Checking the status of a session via a session id通过会话 id 检查会话的状态
【发布时间】:2014-11-08 14:36:49
【问题描述】:

我查看了一些标题相似的帖子 checking status of session with session idHow to tell if a session is active?,但它们似乎并不特定于我想要实现的目标。

我正在构建一个购物车,无论用户是否登录,都可以在其中添加购物车 - 使用 $_SESSIONsession_id()

将项目添加到购物车将条目添加到具有会话 ID 的购物车表。

长话短说,我如何从会话 ID 列表中找出哪些会话是活动的,哪些不是(用于 crontab 中),以便我可以从数据库中的购物车表中删除多余的项目?

【问题讨论】:

  • 您想要会话中的活动和非活动?
  • 从技术上讲,我只需要知道哪些是非活动的,这样我就可以将它们从数据库中删除。
  • 我不确定您是否可以在 PHP 中获得活动/过期会话的列表。但这是你可以做的:一旦购物车被初始化,将会话 ID 存储在一个表中(我猜你已经在这样做了)带有时间戳(我猜你没有在做 那个)。并且每当用户加载页面时更新时间戳(如果用户在页面上花费大量时间,您可以发送 ajax 调用以定期刷新会话)。为旧会话定义一个阈值(例如 2 小时),然后从数据库中删除早于该阈值的会话(可能使用 cron 作业)。让我知道这是否有效。
  • 为什么不保存所有项目的状态?
  • 或者,也许您没有将购物车项目存储在数据库中。将购物车项目存储在会话变量中。问题就解决了。当会话死亡时,垃圾收集器会自动清理内存。它还节省了访问数据库的时间。

标签: php session


【解决方案1】:

如果您有足够的权限,您可以使用SessionHandler 来执行此操作。 (适用于 PHP > 5.4.0)

class MySessionHandler extends SessionHandler
{    
    public function __construct()
    {
        // database initialization code
    }

    public function destroy($id)
    {
        $ret = parent::destroy($id);
        // database uninitialization code
        return $ret;
    }
}

然后在你的代码中:

ini_set('session.save_handler', 'files');
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

在使用它之前,我建议您仔细阅读我上面链接的文档。


但是,由于您正在构建购物车,因此将购物车信息存储在会话变量中会更容易。

【讨论】:

  • 嗯,有趣 - 我确实拥有完整的服务器访问权限,所以我会试一试。我不想只使用会话的唯一原因是因为我希望会员能够重新登录到他们的帐户,并且仍然在他们的购物车中拥有他们选择的商品。
  • @thePav:如果您将其存储在数据库或会话变量中,无论哪种方式,您都必须让您的会话不会长时间过期。
  • 对于非会员,购物车将基于会话(基于时间的到期时间约为 2 小时不活动),对于会员,不会有购物车到期作为数据将在附加到其用户 ID 的数据库中(因此登录的成员不需要购物车会话)。
猜你喜欢
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2014-07-24
相关资源
最近更新 更多