2010-10-31 5 views
2

Мне нужно реализовать систему, чтобы ограничить количество пользователей, которые могут одновременно использовать мое приложение. Я думаю, что лучший способ - подсчитать количество активных сеансов, а затем ограничить их.Подсчитать и ограничить количество пользователей в моем приложении

Как я могу подсчитать количество активных сеансов. Я использую memcached для хранения своих сеансов, если это имеет значение.

+0

Включены ли пользователи с использованием имени пользователя? –

+0

Это приложение для facebook, поэтому ... нет ... но есть аутентификация, поэтому ... Я предполагаю, что ответ, который вы ищете, - это да – Starlin

ответ

1

Я думаю, что самый простой способ для перехвата На сессии open, destroy и gc обратные вызовы (с использованием session_set_save_handler()) и увеличение/уменьшение подсчетом сессии значение в Memcached. Что-то вроде:

class Memcache_Save_Handler { 

    private $memcached; 

    public function open($save_path, $name) { 
     $session_count = (int)$this->memcached->get('session_count'); 
     $this->memcached->set('session_count', ++$session_count); 
     // rest of handling... 
    } 

    public function destroy($id) { 
     $session_count = (int)$this->memcached->get('session_count'); 
     $this->memcached->set('session_count', --$session_count);  
     // rest of handling... 
    } 

} 
+0

Это было бы хорошим решением ... но у меня не было бы никакого способа узнать, когда будет уничтожен сеанс ... Пользователи никогда не выйдут из системы ... их сеанс будет просто отключен ... – Starlin

+0

The 'gc' обратный вызов был исключен из моего примера, но это, вероятно, тот, который вы ищете. Он принимает максимальное время сеанса сеанса как аргумент. Затем вы можете сравнить время жизни с фактической датой изменения сеанса и применить тот же принцип, если он истек. См. Php.net/session_set_save_handler для примеров. – netcoder

+0

Я предполагаю, что вы имеете в виду что-то похожее на http://uk3.php.net/session_set_save_handler#58071. Я смущен, однако, о том, куда идет этот обработчик сеанса. Должен ли он включаться при создании каждой сессии? Когда сборщик мусора работает, как он знает, чтобы выполнить эту функцию? Извините за то, что я n00b - спасибо за ваш полезный совет :) – Starlin

1

Я не знаю, как рассчитывать все активные сеансы в данный момент времени на PHP. Я всегда использовал базу данных для этого, где я бы сохранил IP-адрес и текущую функцию (NOW() SQL). Тогда, я вы можете сделать запрос, как этот (синтаксис MySQL):

SELECT COUNT(*) as active_users 
FROM logged_users 
WHERE last_action > NOW() - INTERVAL 5 MINUTE; 

Вы можете выбрать, чтобы отобразить страницу или запретить пользователю видеть на сайте.

+0

Как бы я узнал, были ли они еще активны? конечно, это только скажет мне, когда они прошли проверку подлинности ... – Starlin

+0

Обратите внимание на условие WHERE. Речь идет о last_action, но не в первый раз. –

+0

Но это означало бы, что мне придется обновлять базу данных, все, что пользователь что-то сделал ... кажется мне неэффективным. – Starlin

1

Может быть, вы можете ограничить максимальное количество одновременных клиентов? (Но это может повлиять на выборка изображений/другого статического содержимого)

Смежные вопросы