我有一个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);
?>
Run Code Online (Sandbox Code Playgroud)
现在位于每个页面的顶部,很容易找出当前有多少用户活动...我现在的问题是,是否有超过限制来阻止更多人创建会话.这是一个问题的原因是我无法告诉加载页面的用户是否已经有一个活动的会话而没有做类似的事情:
<?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;
}
?>
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩,但在此过程中,它将创建一个会话来检查会话是否存在:S ...因此扭曲我的活动会话计数.
所以基本上我有一个解决方案......我的问题是,是否有人有更好的解决方案?如果您认为我的解决方案是最好的,请评论或投票让我知道:D
请帮忙 :)
如果session_id()没有任何参数调用它将返回用户当前的sesssion id或如果没有当前会话ID则返回空字符串,如PHP 函数手册中所述.根据你所拥有的,你会想做这样的事情:
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();
Run Code Online (Sandbox Code Playgroud)
这只是一个检查cookie是否设置了会话名称的快捷方式,如果是,则该值是有效的会话ID字符串.
| 归档时间: |
|
| 查看次数: |
1211 次 |
| 最近记录: |