我有一个PHP应用程序,我希望限制在任何给定时间可以活动的用户数量。我希望保持尽可能轻,因为实现它的原因是因为我们当前的服务器无法处理负载 - 因此这是一个临时解决方案,直到我们可以升级。我们将会话存储在memcache中,因此我编写了以下脚本来计算活动会话并将其存储在一个平面文件中 - 该脚本每5分钟运行一次。
<?php
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211);
$activeSessions = $memcache->getStats();
$file_content = <<<TEXT
<?php
\$activeSessions = {$activeSessions['curr_items']};
?>
TEXT;
file_put_contents("activesessions.php", $file_content);
?>
现在位于每个页面的顶部,很容易找出当前有多少用户活动...我现在的问题是,是否有超过限制来阻止更多人创建会话。这是一个问题的原因是我无法确定加载页面的用户是否已经有一个活动的会话而没有做类似的事情:
<?php
include ('activesessions.php');
//uid is the users facebook id
session_id(md5($uid.$secret));
session_start();
if ($activeSessions > $limit && empty($_SESSION))
{
session_destroy();
include('limit_message.php');
exit;
}
?>
哪个应该可以做到这一点,但在此过程中它会创建一个会话来检查会话是否存在:S ...因此会扭曲我的活动会话数。
所以基本上我有一个解决方案......我的问题是,是否有人有更好的解决方案?如果您认为我的解决方案是最好的,请评论或投票通知我:D
请帮助:)
答案 0 :(得分:8)
如果您在没有任何参数的情况下调用session_id()
,则会返回用户当前的sesssion ID,如果没有当前会话ID,则返回空字符串,如PHP function manual中所述。根据你所拥有的,你会想做这样的事情:
include ('activesessions.php');
//uid is the users facebook id
if ($activeSessions > $limit && session_id() == '')
{
include('limit_message.php');
exit;
}
session_id(md5($uid.$secret));
session_start();
这只是一个检查cookie是否设置了会话名称的快捷方式,如果是,则该值是有效的会话ID字符串。