最好的方法是:检查数据库或使用PHP检查每个页面上的会话

最好的方法是:检查数据库或使用PHP检查每个页面上的会话,php,session,login,handle,Php,Session,Login,Handle,我已经用PHP开发了许多登录系统。基本上,对于我创建的每个网站或应用程序,它都有一个登录方案来创建文章、上传图像、编辑评论等等 我从来没有遇到过这样的问题,除了有一次我在自己的网站上创建了一种社交网页。有一个用户打扰了其他用户,所以我决定删除他的个人资料,这就是为什么我在这里请求您的帮助 当时,我只是在每个页面上检查会话,例如: <?php if($_SESSION['loggedin'] === true) { // Keep that page } else { //

我已经用PHP开发了许多登录系统。基本上,对于我创建的每个网站或应用程序,它都有一个登录方案来创建文章、上传图像、编辑评论等等

我从来没有遇到过这样的问题,除了有一次我在自己的网站上创建了一种社交网页。有一个用户打扰了其他用户,所以我决定删除他的个人资料,这就是为什么我在这里请求您的帮助

当时,我只是在每个页面上检查会话,例如:

<?php
if($_SESSION['loggedin'] === true)
{
    // Keep that page
}
else
{
    // redirect to login page   
}
?>

然后,当我删除他的个人资料时,会话还没有结束,之后用户继续骚扰其他用户,我什么也做不了


那么,处理每个页面上的会话最常见也是最好的方法是什么:每次检查数据库还是只检查会话是否为真?

每次加载页面时检查数据库的效率非常低。如果你只是想杀死他的会话,你应该将会话存储在memcached中,其中“密钥”是基于用户名的,比如“johnsmith session”,然后在管理页面上,向memcached发送一条消息杀死该密钥,这会立即让他从你的站点注销

如果PHP当前正在将会话数据写入磁盘,这取决于数据的序列化方式,您可以在磁盘上跟踪他的会话文件并删除该文件,这将完成相同的任务:用户下次尝试加载新页面时,他的会话将无效,需要他再次登录


请记住,真正持续存在问题的用户通常会重新注册一个新帐户以继续他们的滑稽动作,因此您可能需要其他方法来监视该用户的新注册。

我不知道什么是最好的方法,但我会这样做:

我有一个包含会话的sql表(例如userid、sessionid、expiredate等等)

sessionid“保存”在$\u会话['cms\u会话']中

如果会话表中不存在$\u SESSION['cms\u SESSION']中的sessionid,则用户不再登录


为了删除表中的旧会话,我使用cron。

您试图做的是在一个地方维护用户状态,并知道更改将立即反映出来


检查数据库中的“user_status”字段是对每个请求进行的非常有效的调用。这提供了一个单一的位置,您知道如果停用用户,更改将反映在他们的下一个请求中。您也可以轻松地执行此操作,而无需编写另一组例程来查看会话变量或创建某种消息传递系统,应用程序会在其中宣布用户已被停用。

您应该添加一个.htaccess重写规则,其中有一个ip地址将它们转发到您的注销页面simpleszzzYes,实际上我现在正在使用这个方法,我只是想知道其他开发者是否同意我的观点。感谢小型站点,这将是有效的,但如果您打算为“大量”用户进行扩展(当然,“大型”是由服务器/集群的容量定义的),您只需使用基于内存的解决方案,如memcache。Brian的方法实际上与我们在Armor Games中所做的非常相似,在Armor Games中,我们将所有会话数据与用户的“活动”标志一起存储在memcache中。通过调用
memcache\u get($memcache\u obj,array($key1,$key2,$key3等))
来查询memcache中的多个键对我们来说非常有效。@iandouglas-我同意你对大型站点的看法,但对于小型甚至中等规模的站点来说,这会增加系统的复杂性。@BrianHoover是的,我同意。如果您使用的是共享托管帐户,则可能无法访问memcache之类的工具。但是,如果您使用的是VPS或其他可以完全定制的环境(如EC2),那么只需几分钟即可安装memcached,使用Pear安装memcache库for PHP,并添加几行代码。不需要太多其他东西。