Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ограничить кол-во пользователей 
V
    Опции темы
gta4kv
Дата 18.4.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Всем привет!

Есть задача - ограничить кол-во пользователей на сайте. Например 5 пользователей одновременно максимум, причем "сессия" пользователя длиться 12 часов а не 15 минут. 

Есть вариант как реализовать это без базы?

заранее благодарен

Это сообщение отредактировал(а) gta4kv - 18.4.2008, 23:03
PM MAIL   Вверх
awers
Дата 18.4.2008, 23:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



gta4kv, собственно пара вопросов:
1) Почему без базы (ведь сериализованный массив или текстовый файл тоже можно использовать как базу)
2) Твое понимание слова "Одновременно". Вот смотри, ведь физически к одному ресурсу невозможно обращение более чем 1го клиента )))
3) Почему сессия на 12 часов? Т.е. получается очень некрасиво, ведь человек не закрывший сессию и ушедший с сайта через 15 минут после того как ушел с него - блокирует свое место на 11 часов! )
PM MAIL WWW ICQ Skype   Вверх
gta4kv
Дата 19.4.2008, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



1) можно вообщем то и с базой
2) Одновременное нахождение человеков на сайте smile
3) так надо smile а кому то не повезло
PM MAIL   Вверх
ksnk
Дата 19.4.2008, 08:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Тупо влоб!
5 файлов с именами user1... user5. Вместо (вместе с) идентификатором юзера передаем еще и индекс файла.
Если юзер активизировался - делаем touch на этот файл. 
Если юзер новый - пытаемся найти файл со временем, старше чем 12 часов, не нашли - облом...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
awers
Дата 19.4.2008, 08:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



Ну тогда теория. 
Проверяем кол-во записей в таблице, если < 5 - показываем страницу авторизации, иначе отсылаем на страницу с ошибкой.
При успешной авторизации в массив добавляем запись:
SESSION ID, TIME START
... Тут же все просто
PM MAIL WWW ICQ Skype   Вверх
gta4kv
Дата 19.4.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Решил сделать как предложил ksnk. Но что-то с этим временем запутался...

Это проходит при логинации
Код

public function login( )
    {
        $this -> key = md5(  $_POST[ 'uid' ] . md5( W3C )  . md5( GLOB_NOSORT ) . md5( IMAGETYPE_TIFF_II ) . md5( HASH_HMAC ) . md5( date( d ) ) );
        $this -> exp = ( 24 - date( g ) ) * 60 * 60;    
        
        if( $this -> key == $_POST[ 'code' ] )
        {
            setcookie( 'site_key', $_POST[ 'code' ] ); 
            setcookie( 'site_id', $_POST[ 'uid' ] ); 
            {
                $fp = fopen( "users/" . $_POST[ 'uid' ] . ".touch", "w" );
                fwrite( $fp, time() );
                fclose( $fp );
            }
            
            return true;
        }
        else 
        {
            return false;
        }
        
    }


Это при каждом заходе:
Код

touch( "users/" . $_COOKIE[ 'site_id' ] . ".touch" );


В файле записано время когда создавался файл, а т.е зашел юзер. 
Как сделать что бы когда прошло $x часов - файл удалялся? 
PM MAIL   Вверх
Fortop
Дата 19.4.2008, 16:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(gta4kv @  19.4.2008,  13:11 Найти цитируемый пост)
Как сделать что бы когда прошло $x часов - файл удалялся?  

Эта проверка у тебя должна стоять при заходе любого пользователя.

Т.е. смотришь какой из файлов имеет дату <= сейчас - $x часов
и удаляешь все.

Это сообщение отредактировал(а) Fortop - 19.4.2008, 16:07


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
gta4kv
Дата 19.4.2008, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Кошмар, ваще мозг на время не варит.


Код

$time = время_из_файла;
if( $time <= time() - ( $bojan->maxTime * 60 *60 ) ) unlink( $file );


Добавлено через 10 секунд
правильно ли это?

Добавлено через 13 минут и 25 секунд
maxTime = 1
PM MAIL   Вверх
Fortop
Дата 19.4.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



В общем-то да, только тебе надо это для всех 5ти файлов делать сразу.
Т.е. все которые попали в это условие - убить.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
gta4kv
Дата 19.4.2008, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Fortop, ок. спасибо.

опять со временем проблема, не могу вычислить:

Код

$time = file_get_contents( $file_l );
$time_l = ( $time + ( $this->maxTime * 60 * 60 ) - time( ) );
echo "Ваша сессия будет длиться еще: " . date( 'G часа(ов) i минуты(а)',  $time_l ) . "<br /> \n" ;


$this->maxTime = 1;

как вычислить нормально сколько осталось до конца сессии?
PM MAIL   Вверх
Fortop
Дата 19.4.2008, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(gta4kv @  19.4.2008,  19:14 Найти цитируемый пост)
опять со временем проблема, не могу вычислить:

Ты чего?

$session_time =  time() - http://ua2.php.net/manual/ru/function.filemtime.php


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
gta4kv
Дата 19.4.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Fortop, нет. "сессия" образное говорил.. просто "сеанс" пользователя, который не прекращается $x часов

Это сообщение отредактировал(а) gta4kv - 19.4.2008, 20:38
PM MAIL   Вверх
Fortop
Дата 19.4.2008, 20:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Да, какая разница образно или нет smile Время ее длительности вычисляется так, как я написал.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
gta4kv
Дата 19.4.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Fortop, ну и когда остается час, выдает:

Код

Ваша сессия будет длиться еще: 28 минуты(а)


Честно туплю :( скину щас весь код...

Код

<?php
ob_start( );
class protectedSystem
{
    public  $key;
    public  $siteKey;
    private $authKey;
    private $form;
    private $exp;
    private $maxUsers = 1;
    public  $maxTime  = 1;
    private $i = 0;
    
    public function __construct( )
    {
        chmod( "users", 0777 );    
        $file_l = ( "users/" . $_COOKIE[ 'site_id' ] . ".touch" );
        if ( $handle = opendir( 'users/' ) ) 
        {
         while ( false !== ( $file = readdir( $handle ) ) ) 
         { 
             if ( $file != "." && $file != ".." && $file != ".htaccess") 
             { 
                 $this->i++; 
             } 
         }
         
         closedir( $handle ); 
        }
        
        
        if( $this->i  > $this->maxUsers )
        {
            
            if( !file_exists( $file_l ) )
            exit( "Достигнуто максимальное кол-во пользователей!" );

        }
        
        if( isset( $_COOKIE[ 'site_key' ] ) ) 
        {
            $time = file_get_contents( $file_l );
            $time_l = time( ) - fileatime( $file );
            echo "Ваша сессия будет длиться еще: " . date( 'i минуты(а)',  $time_l ) . "<br /> \n" ;
        }
    } 
    
    public function showForm( )
    {
        $this -> form = "
            <form action=\"?login\" method=\"post\" enctype=\"multipart/form-data\"> \n
            Ваш ID: <input type=\"text\" name=\"uid\" />\n  <br />  \n
            Ваш CODE: <input type=\"text\" name=\"code\" />  \n <br />  \n
            <input type=\"submit\" value=\"Войти!\"> \n </form> \n \n
        ";
        print $this -> form;
    }
    
    public function login( )
    {
        $this -> key = md5( /* тут сташный секрет */ );
        $this -> exp = ( 24 - date( g ) ) * 60 * 60;    
        
        if( $this -> key == $_POST[ 'code' ] )
        {
            setcookie( 'site_key', $_POST[ 'code' ] ); 
            setcookie( 'site_id', $_POST[ 'uid' ] ); 
            {
                $file = ( "users/" . $_POST[ 'uid' ] . ".touch" );
                if( !file_exists( $file ) )
                { 
                    $fp = fopen( $file, "w" );
                    fwrite( $fp, time() );
                    fclose( $fp );
                }
                else 
                {
                    touch( $file );
                }
            }
            
            return true;
        }
        else 
        {
            return false;
        }
        
    }
    
    public function chek( )
    {
        $siteKey = $_COOKIE[ 'site_key' ];
        $this -> authKey = md5( /* тут сташный секрет */ );
        
        if( $this -> authKey != $siteKey )
        {
            setcookie( 'site_key', null, time() - 50000 ); 
            setcookie( 'site_id', null, time()  - 50000 ); 
            return false;
        }
        else  
        {
            return true;
        }
    }
    
    public function unlogin( )
    {
        setcookie( 'site_key', null, time() - 50000 ); 
        setcookie( 'site_id', null, time()  - 50000 ); 
        return true;
    }
    
    public function content( )
    {
        print "Ты залогинен! Ключ падашел :)";
    }
}

$bojan = new protectedSystem( );

if( $bojan->chek() == false )
{
    $bojan -> showForm( );
}
else
{
    $bojan -> content( );
    $file = ( "users/" . $_COOKIE[ 'site_id' ] . ".touch" );
    touch( $file );
    $time = file_get_contents( $file );
    
    if( $time <= time() - ( $bojan->maxTime * 60 * 60     ) )  { unlink( $file ); $bojan->unlogin(); }
    
}

if( isset( $_GET[ 'login' ] ) )
{
    if( $bojan -> login() == false )
    {
        header( "Location: index.php" );
    }
    else 
    {
        header( "Location: index.php" );
    }
}
ob_end_flush();
?>


Это сообщение отредактировал(а) gta4kv - 19.4.2008, 21:42
PM MAIL   Вверх
Fortop
Дата 19.4.2008, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



gta4kv, Тебе время надо в часах? или минутах?

Это что? 
Код

$this -> exp = ( 24 - date( g ) ) * 60 * 60;    

Минуты ты просто игнорируешь я так понимаю

Так зачем ты их потом выводишь?

Это раз.


Два.
Сделай вместо этого
Код

echo "Ваша сессия будет длиться еще: " . date( 'i минуты(а)',  $time_l ) . "<br /> \n" ;


вот это, и посмотри.
Код

echo "Ваша сессия будет длиться еще: " . date( 'H:i минуты(а)',  $time_l ) . "<br /> \n" ;


Три
Правильный код расчета оставшегося времени.

Код

$t1=fileatime( $file ); // время старта сессии пользователя.
$t2 = time(); // текущее время
$t3 = 24 * 3600; // максимальная длительность сессии.

$time_l = $t3 - ($t2 - $t1); // считаем сколько осталось (длительность - (текущее - начало)) скобки сам раскроешь, если захочешь.

if ($time_l > 0) { // если разница больше нуля, значит сессия еще длится

echo "Ваша сессия будет длиться еще: " . date( 'H:i минуты(а)',  $time_l ) . "<br /> \n" ;

} else {
// сессию надо убить. она окончилась.
}


Это сообщение отредактировал(а) Fortop - 19.4.2008, 23:31


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1243 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.