如何在比会话通常存在的时间更长的时间内识别访客用户


How can I identify a guest user for a time longer than session usually exists

我知道,我可以使用'Session::getId()。但它会不时地发生变化。也许我不了解会议内容。正如我所知,它在php运行时启动,在php代码完成时删除。另一方面,我读到会话id存储在cookie中,当用户再次打开您的网站时,会话将"恢复"。那么,为什么在我的情况下,会话id会这么快过期呢。我如何获得购物车使用的至少一个月不变的"会话id"?

更新:这个问题变得有点令人困惑,因为我不想如何调用某些东西,也不知道这些东西是如何工作的。

我想知道如何识别访客用户并在一段时间内获得其唯一id(比通常存在的会话更长)。结果,我想要一个函数someFunction,它可以做以下事情:

$guestId = someFunction();
$dbRow = Model::findByGuestIdOrNew($guestId);
// now $dbRow contains all previosly save info about a guest user, 
// of it does not exists, create new row by `$guestId`.

在我看来,会话有一些独特的id,它存在的时间比会话长。当我看到在大多数购物车包中,购物车项目直接保存到会话时,我想到了这个想法。我真的不知道这些包裹能储存购物车物品多久,但我认为这段时间甚至超过一周。购物车的这段时间是我在使用shopify和bigcommerce这样的购物平台时定义的。我知道他们存放购物车商品的时间超过一周。所以我想知道在访客用户创建帐户之前,他们是如何识别他的。此外,了解大多数"购物车"包裹存放购物车物品的时间也是一个有用的信息。

Laravel实现了一种自定义的会话处理方式,但其逻辑与PHP会话文档中描述的逻辑相同。以下是该文档的摘录,大致解释了其背后的逻辑:

会话是一种根据唯一的会话ID为单个用户存储数据的简单方法。它可以用于在页面请求之间持久保存状态信息。会话ID通常通过会话cookie发送到浏览器,该ID用于检索现有会话数据。缺少ID或会话cookie可以让PHP知道创建一个新会话,并生成一个新的会话ID。

因此,您对会话如何使用ID的理解是正确的,但会话还有另一个组件可以定义它们的持续时间。会话在预定义的时间段后过期,在Laravel的情况下,可以在config/session.php文件中设置:

'lifetime' => 120,

上述默认值意味着会话将在用户处于非活动状态120分钟后过期。还可以选择在用户关闭浏览器时使会话过期,从而在用户再次打开浏览器时强制生成新会话,方法是设置:

'expire_on_close' => true,

您应该阅读Laravel会话文档,以了解Laravel如何处理会话,还应该阅读config/session.php文件中的注释,这些注释解释了每个配置选项的作用及其取值。


上面解释了会话在PHP和Laravel中的工作方式,因此在您的情况下,为了使会话持续一个月,您可以将lifetime值设置为:

'lifetime' => 60*24*30 // 60 minutes x 24 hours x 30 days = 43200 minutes

但是,保持会话似乎需要很长时间,尤其是在会话中还包含身份验证信息的情况下。如果你想保留购物车的内容,我建议你把它们存储在数据库中,当用户下次登录时,只需从数据库中填充会话。


例如,Cartalyst Cart库(恰好具有非常好的Laravel集成)处理购物车背后的所有逻辑,同时提供了一个很好的sync方法,允许您将存储在数据库中的购物车项目添加到当前会话中。您可以执行以下操作从数据库中恢复购物车:

// Get the items from the database
$items = CartItem::where('user_id', Auth::id())->get();
// Sync the items with the session cart
Cart::sync($items);

以上假设您有一个附加了CartItem模型的cart_items表,并且您正在使用Laravel身份验证来处理用户会话,但正如您所看到的,它带来了一个非常易于实现的解决方案。