Модераторы: korob2001, ginnie

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Помогите плиз с одной не сложной задачкой 
V
    Опции темы
Materium
Дата 4.12.2006, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Привет профессионалам от начинающего программиста.
Подскажите пожалуйста:: написал чат на Perl, всё, кроме одного!
Не понимаю толком как сделать отображения Ников, которые в данное время находятся в чате.
Я добавлял в файл пришедших, потом этот файл выводится. Но так он разростётся до бесконечности, а я должен знать, что вот этого Ника в чате уже нет и удалить его из файла. Вопрос не сложный, я просто в обновляемом, к примеру каждые 5 секунд скрипте могу обнулять полностью файл и добавлять из кукеса пользователя, а потом выводить. Так получится массив пользователей, а которые ушли, соотвественно в этот список уже не попадут. Но проблема в том, что разные пользователи запускают этот сценарий в своё время, и файл соотвественно может обновиться через секунду, через две, в любое время, получается что он постоянно обновляется, и, соответственно, в отображаемом списке не будет половины, а то и почти всех пользователей, текущих. Ответ формально нашёл в том, что файл с присутствующими пользователями должен обнуляться в одно для всех пользователей время. Обнуляется, потом снова выстраивается на основе тех Ников, которые сидят в чате. А как написать независимый скрипт? Встаёт вопрос о написании простого робота, который каждые там десять секунд обнулял бы файл по заданному пути. К сожалению мои знания здесь пока ограничиваются. Мне даже интересно как остановить запущенного робота. Может кто-нить поможет и приведёт простой скрипт, где робот, например, удаляет некоторый файл каждый 10 секунд???
--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok";
PM MAIL   Вверх
korob2001
Дата 5.12.2006, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 13
Всего: 61



Сессии тебе нужны. Обнулять весь файл не нужно, удаляй только тех товарисчей, который не были активны в определённый интервал времени, например 15 минут.
Например файл содержит список пользователей в таком формате:
Цитата

ip1 => 1165264416|login1
ip2 => 1165264408|login2
ip3 => 1165264410|login3

Где:
ip[x] - текущий ip клиента, он же является ключём.
1165265470 - время окончания сессии, текущее время + 15 минут, а точнее + (15 * 60).
login[x] - login пользователя.

Далее при каждом обращении отсеивай тех, у кого истекло время сессии. Примерно так:
Код

use Fcntl qw(:flock);
use DB_File;

# Получаем ip клиента
my $ip = $ENV{HTTP_X_FORWARDED_FOR} || $ENV{REMOTE_ADDR};
my(%session, @active_list) = ();

# Начало блокировки
sub start_lock {
     open(BLOCK, "> lock.sem") or die $!;
     flock(BLOCK,LOCK_EX) or die $!;
}

# Конец блокировки
sub stop_lock {
    close(BLOCK);
}

&start_lock(); # Блокируем файл на семофоре

# Связываем файл с хешем
tie(%session, "DB_File", "session") or die $!;

# Если такой ip уже есть в файле, обновим его сессию
if (exists $session{$ip}) {
    my $sess_stop = time() + 15 * 60;
    $session{$key} = join("|", $sess_stop, $us);  # обновим сессию.
} else {
    # Тута сообщение об ошибке и просим человека авторизоваться.
}

while (my($key,$val) = each %session) {
     my($tm,$us) = split(/\|/, $val);
     if ($tm < time()) {
         delete $session{$key};  # Удаляем пользователя
     } else {
         push(@active_list, $us);  # В противном случае добавим в массив имя пользователя.
     }
}

# Разрываем связсь между хешем и файлом.
untie(%session);

# Снимаем блокировку.
&stop_lock();

# Результат (всех активных пользователей) выводим на страницу
print "Content-type: text/html\n\n";
print "<html><body>";
print join("<br/>", @active_list) . "<br/>";
print "</body></html>";

При авторизации пользователя, та программа которая сверяет логин и пароль, должна делать первую запись в этот файл, примерно так:
Код

my %session = ();
if ($login eq "......" and $pass eq "......") {
    # здесь нужно начать блокировку

    # Связываем хеш с файлом
    tie(%session, "DB_File", "session") or die $!;
    my $ip = $ENV{HTTP_X_FORWARDED_FOR} || $ENV{REMOTE_ADDR};
    my $sess_stop = time() + 15 * 60;
    $session{$ip} = join("|", $sess_stop, $login);
    untie(%session);
   
    # Здесь нужно завершить блокировку
} else {
    # Не верный логин или пароль.
}

PS: Здесь я заюзал возможности DBM файлов, можно сделать что-то в этом роде и при помощи обычных файлов, особенно если это файлы с записями фиксированной длины, когда файл можно открывать сразу и для чтения и для записи. Но это уже дело твоё, где хранить сессии.
Важно то, что здесь сессия для всех одна и та же, отталкивается она не от клиентского времени, а от серверного.
Так же есть уже готовые модули, например CGI::Session.

Это сообщение отредактировал(а) korob2001 - 5.12.2006, 00:29


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Materium
Дата 5.12.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Огромное спасибо! что-то мне эта идея сразу в голову не пришла. обязательно попробую, всё должно получиться! ))) потом напишу что и как. )))
--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok";
PM MAIL   Вверх
Materium
Дата 6.12.2006, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Эксперт сенькс всё сделал всё работает.
Только у меня вопрос. Если я tie не пользую а пользую dbmopen(%ХЭШ, $file, 0755) or die;
Как мне в этом случае блочить $file для монопольного доступа???
И вообще мне честно не оч понятен синтаксис tie(%session, "DB_File", "session") or die $!;
Как написанное знает что я пользую например файл с именем adm??? вместо DB_File ставим что ли, в частности наш lock.sem?
--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok";
PM MAIL   Вверх
korob2001
Дата 7.12.2006, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 13
Всего: 61



Так за блокировку отвечает, в данном случае, не DB_File, а Fcntl. Блокируй так же, как и с tie.
Код

&start_lock();
dbmopen(%dbm,"session",0644) or die $!;

# Здесь работаем с файлом

dbmclose(%dbm);
&stop_lock();

Очередь будет стоять в точке вызова &start_lock(). Как только хеш освободится, файл блокирует следующий из очереди и т.д.

Я в прошлый раз не сказал, но так же можешь добавить ещё чего-нить в сессию то, что чаще всего используешь, тогда тебе не придётся каждый раз обращаться за этой информацией к базе или парсить файлы, в её поисках, но помни что длина key+value не должна превышать 1024 байта. Разумеется пароли, номера кредиток и т.п. сохранять не следует. Хотя впринципе можно и их хранить там, но в зашифрованном виде, на тот случай если этот файл сопрут. Открывай файл DBM с chmod 0644.

Это сообщение отредактировал(а) korob2001 - 7.12.2006, 03:26


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Materium
Дата 8.12.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Эксперт, то есть как я прально понял наш open(BLOCK, "> lock.sem") or die $!; , в частности сам файл lock.sem выполняет одну простую роль, выступает в роли как бы буфера, мы просто используем файл для того чтобы ограничивать доступ к нашему хэш-файлу? Никакой другой ценности существование lock.sem не представляет так? Точно также как мы вообще можем не пользовать хэш-файл а делать что нам вздумается, а народ будет ждать своей очереди на вып. нашего кода? Если так то я понял, если не так то я запутался )))
Но если я прав тогда выпрашивается вывод, что для использования хэш-файлов отдельной блокировки почему-то не создали???? то есть для функции open создали, а для tie и dbmopen нет? )))
Интересно. )))

Добавлено @ 14:11 
Да и ещё простой вопрос, что лучше, если можно так выразиться, исп. dbmopen или tie??
Заранее спасибо
--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok";
PM MAIL   Вверх
korob2001
Дата 8.12.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 13
Всего: 61



Почитай вот эту тему, там я приводил код, который наглядно показывает работу блокировок. Только выполни все действия которые я там описал.



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Materium
Дата 9.12.2006, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Эксперт. вот тут такая задачка, простая для тебя.
есть простой файл и строчки в нём коротенькие. нужно удалить, предположим, одну среднюю.
я знаю несколько циклов, но все перепробовал почему-то сравнение не работает, строчки со значением.... ((( бред какой-то но не исп. же одни db файлы в самом деле, хотя конечно ключ удалить намного удобнее. но мне принципиально сделать это с файлом, но плохо что-то получается

Добавлено @ 00:07 
значение берётся из $cgi->param
примерно так дело обстоит
$nick=$cgi->param('nick');
@ar1=();
@ar2=();
open(FL, "< sess") or die $!;
flock(Fl, 2);
@ar1=<FL>;
flock(FL, 8);
close FL;
       foreach my $str (@ar1) {
                          push(@ar2, $str) if ($nick ne $str);
       }
тут вывожу @ar2 - всё по прежнему, то есть и пишет он в > "sess" прежнее.
А должно быть всё кроме совпадения с $nick

перепробовал ещё два способа - везде один хрен!

--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok";
PM MAIL   Вверх
korob2001
Дата 9.12.2006, 03:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 13
Всего: 61



Новичок. Попробуй вместо этого:
Код

@ar1=<FL>;

написать так:
Код

chomp(@ar1=<FL>);


Строку:
Код

flock(FL, 8);

удали она не нужна, с файла будет снята блокировка после его закрытия.

Это сообщение отредактировал(а) korob2001 - 9.12.2006, 03:12


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Materium
Дата 11.12.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Спасибо, удаление символа конца строки помогло )))
Кста, эксперт, никто не знает... ? вот по правой кнопке мыши можно страницу просмотреть в штмл коде. Как сделать из своего сценария чтобы нельзя было людям просмотреть??? через Perl можно так сделать? или это Java VB Script-ы?
--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok";
PM MAIL   Вверх
korob2001
Дата 11.12.2006, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 13
Всего: 61



Нет новичёк, из Perl нельзя, так как он работает на стороне сервера. Можно с JavaScript попробовать, примерно так:
Код

<html>
    <head>
        <title>Test</title>
        <script language="JavaScript" type="text/javascript">
            <!--//
                function stopContext() {
                    window.alert("Fuck off");
                    event.returnValue = false;
                }
            //-->
        </script>
    </head>
    <body oncontextmenu="stopContext()">
    
    </body>
</html>

Но это всё равно не защита, это так прикол. Кому будет нужно смогут открыть твой исходник HTML.

Это сообщение отредактировал(а) korob2001 - 11.12.2006, 21:29


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Materium
Дата 14.12.2006, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Отличный у вас форум! Самый лучший.
Буду обращаться!

Добавлено @ 23:20 
А скрипт cgi могут люди смотреть как-нить? Если могут то как? Или это задача подсилу специалистам только? Я так понимаю чтобы просмотреть его нужно иметь права, чтобы войти, например, по ftp в мою папку на серваке. Но это уже подстать тому чтобы сделать всё что угодно с ресурсом )))
--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok";
PM MAIL   Вверх
Materium
Дата 15.12.2006, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Да Короб я попробовал скрипт. Неплохо, но в меню в браузере есть фишка та же - открыть в html. Не знаешь она отключается? Вообще это конечно не суть важно, но иногда не хотелось бы что-то показывать лишнее.
Вроде лучше дело обстоит с фреймами. в один я вставил скрипт, из менюшки браузера открывается соответственно в html скрипт, который и создаёт эти фреймы и всё. остальные защищены.
--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok";
PM MAIL   Вверх
korob2001
Дата 15.12.2006, 03:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 13
Всего: 61



Цитата(Materium @  14.12.2006,  20:17 Найти цитируемый пост)
А скрипт cgi могут люди смотреть как-нить?

Если права поставишь как у исполняемой программы, то не смогут, т.е. 0755. Ну и конечно же если дыр не будет.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
nitr
Дата 15.12.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



Materium, скрыть html-код не под силу никому smile Сколько бы не пытались...
К примеру, скрипт который скрывает. В IE работает на ура, но можно же отключить js. Можно не показывать страничку если отключены js. Но есть и другие браузеры smile, в которых данный скрипт может работать либо с ошибками, либо им плевать на ограничение. Можешь поставить ограничение на просмотр, только с помощью IE, это неочень хорошо, но и здесь другие браузеры смогут помочь ;) они представятся как IE smile
В общем либо я не встречал, либо реально такое не сделать ;) я остаюсь при своём мнении... smile

Про CGI korob2001, всё правильно ответил, добавлять нечего.

З.Ы.: если говорил мутно, спрашивай конкретно что не ясно. Спасибо за внимание ;)


--------------------
PM   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

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


 




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


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

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