每次有人加载他们的页面时,它都必须检查数据库以查看他们的会话是否仍然有效。我想知道是否在那个 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 的序列化数据语法会很快改变(……或者是吗?)。