Пользовательский лимит для моего приложения PHP - с примером кода - PullRequest
5 голосов
/ 02 ноября 2010

У меня есть приложение 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

Пожалуйста, помогите:)

1 Ответ

8 голосов
/ 02 ноября 2010

Если вы вызовете session_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();

Это просто ярлык, который проверяет, установлен ли файл cookie с именем сеанса, и если да, то значение равнодопустимая строка идентификатора сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...