0

我正在使用 PHP 和 MySQL 为我的网站制作会话系统。这个想法是,如果用户会话处于非活动状态,用户会话将持续大约 5 分钟,并且 CronJob 不时运行并检查会话是否过期,如果是,则删除会话。

问题:

每次有人加载他们的页面时,它都必须检查数据库以查看他们的会话是否仍然有效。我想知道是否在那个 CronJob 任务中,我可以让它找到用户 PHP Session 并更改一个变量,例如$_SESSION['isValidSession']并将其设置为false.

因此,一旦他们加载页面,它只会检查该变量是否会话有效。

对不起文字墙!

TL;DR:我想修改不同指定会话的会话变量。

谢谢。

4

3 回答 3

1

每次有人加载他们的页面时,它都必须检查数据库以查看他们的会话是否仍然有效。我想知道是否在那个 CronJob 任务中,我可以让它找到用户 PHP Session 并更改像 $_SESSION['isValidSession'] 这样的变量并将其设置为 false。

无论如何,您都必须这样做。当用户加载他们的页面时,系统必须验证数据库中是否存在会话(我假设您正在使用数据库)。

如果你每分钟运行一次 cron 作业,并让所有超过 5 分钟的会话过期(这似乎有点过分?如果我正在阅读一个长页面,我经常在网站上保持不活动状态 5、10 甚至 15 分钟),这将自动“标记无效”(实际上是删除)会话。

通常,您会保留一TIMESTAMP列,其中包含该行的最后更新时间(即该会话),并且 cron 作业将DELETE所有行的时间戳早于五分钟前。重新加载页面时,系统将不再找到相关的会话行,并推断(正确)会话已过期。

但是,您想要的(读取会话知道其 SessionID)可以通过 cron 作业(您可以在 PHP 中编写作业)读取会话来完成,或者加载为给定其 ID 的现存会话,或者通过读取数据库列保存使用 a 的序列化数据并对其进行SELECT SessionData FROM SessionTable WHERE id = 'SessionId';反序列化。然后修改膨胀的对象,重新序列化它并使用 SQL 将其存储回数据库中UPDATE。嘿 presto!,会话现已修改。

但请注意,这可能会导致活动客户端出现并发问题,并且不能一劳永逸地在 SQL 中完成 - 您不能UPDATE Sessions SET isInactive = 1 WHERE expiry...直接执行。通常,您需要逐一读取感兴趣的行,将它们反序列化并将它们存储回来,并使用 PHP 代码对其进行处理。

您可以通过两种不同的解决方法间接地做到这一点。

一,您更改会话代码以使用非序列化数据。这将影响可维护性和性能(您不能“只是添加”某些内容到会话中:您必须为其创建一个列)。

二:您利用序列化形式中“0”和“1”具有相同长度的事实。也就是说,包含isValidSession(14 个字符的名称)的序列化会话将包含文本

 ...{s:14:"isValidSession";b:1;}...

你可以用 改变那段字符串{s:14:"isValidSession";b:0;},从而isValidSession变成False。这不是特别好的做法——你在弄乱系统的内部结构。当然,我认为没有人期望 PHP 的序列化数据语法会很快改变(……或者是吗?)。

于 2013-02-07T23:27:37.323 回答
0
<?php var_dump($_SESSION); ?>
于 2013-02-07T23:06:25.987 回答
0
  1. 您应该将用户上次请求的时间存储在数据库中。
  2. 在cornjob中,您应该检查用户上次查看时间并与当前时间进行比较,然后检查哪个用户时间已过期。
  3. 然后将过期用户的数据库列更新为false。
  4. 之后,您只需检查数据库中的该列即可轻松找出应该注销的用户。
于 2013-02-07T23:18:48.223 回答