![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Materium |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 4.12.2006 Где: Питер Репутация: нет Всего: 2 |
Привет профессионалам от начинающего программиста.
Подскажите пожалуйста:: написал чат на Perl, всё, кроме одного! Не понимаю толком как сделать отображения Ников, которые в данное время находятся в чате. Я добавлял в файл пришедших, потом этот файл выводится. Но так он разростётся до бесконечности, а я должен знать, что вот этого Ника в чате уже нет и удалить его из файла. Вопрос не сложный, я просто в обновляемом, к примеру каждые 5 секунд скрипте могу обнулять полностью файл и добавлять из кукеса пользователя, а потом выводить. Так получится массив пользователей, а которые ушли, соотвественно в этот список уже не попадут. Но проблема в том, что разные пользователи запускают этот сценарий в своё время, и файл соотвественно может обновиться через секунду, через две, в любое время, получается что он постоянно обновляется, и, соответственно, в отображаемом списке не будет половины, а то и почти всех пользователей, текущих. Ответ формально нашёл в том, что файл с присутствующими пользователями должен обнуляться в одно для всех пользователей время. Обнуляется, потом снова выстраивается на основе тех Ников, которые сидят в чате. А как написать независимый скрипт? Встаёт вопрос о написании простого робота, который каждые там десять секунд обнулял бы файл по заданному пути. К сожалению мои знания здесь пока ограничиваются. Мне даже интересно как остановить запущенного робота. Может кто-нить поможет и приведёт простой скрипт, где робот, например, удаляет некоторый файл каждый 10 секунд??? --------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok"; |
|||
|
||||
korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Сессии тебе нужны. Обнулять весь файл не нужно, удаляй только тех товарисчей, который не были активны в определённый интервал времени, например 15 минут.
Например файл содержит список пользователей в таком формате:
Где: ip[x] - текущий ip клиента, он же является ключём. 1165265470 - время окончания сессии, текущее время + 15 минут, а точнее + (15 * 60). login[x] - login пользователя. Далее при каждом обращении отсеивай тех, у кого истекло время сессии. Примерно так:
При авторизации пользователя, та программа которая сверяет логин и пароль, должна делать первую запись в этот файл, примерно так:
PS: Здесь я заюзал возможности DBM файлов, можно сделать что-то в этом роде и при помощи обычных файлов, особенно если это файлы с записями фиксированной длины, когда файл можно открывать сразу и для чтения и для записи. Но это уже дело твоё, где хранить сессии. Важно то, что здесь сессия для всех одна и та же, отталкивается она не от клиентского времени, а от серверного. Так же есть уже готовые модули, например CGI::Session. Это сообщение отредактировал(а) korob2001 - 5.12.2006, 00:29 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
Materium |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 4.12.2006 Где: Питер Репутация: нет Всего: 2 |
Огромное спасибо! что-то мне эта идея сразу в голову не пришла. обязательно попробую, всё должно получиться! ))) потом напишу что и как. )))
--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok"; |
|||
|
||||
Materium |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 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"; |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Так за блокировку отвечает, в данном случае, не DB_File, а Fcntl. Блокируй так же, как и с tie.
Очередь будет стоять в точке вызова &start_lock(). Как только хеш освободится, файл блокирует следующий из очереди и т.д. Я в прошлый раз не сказал, но так же можешь добавить ещё чего-нить в сессию то, что чаще всего используешь, тогда тебе не придётся каждый раз обращаться за этой информацией к базе или парсить файлы, в её поисках, но помни что длина key+value не должна превышать 1024 байта. Разумеется пароли, номера кредиток и т.п. сохранять не следует. Хотя впринципе можно и их хранить там, но в зашифрованном виде, на тот случай если этот файл сопрут. Открывай файл DBM с chmod 0644. Это сообщение отредактировал(а) korob2001 - 7.12.2006, 03:26 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
Materium |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 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"; |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Почитай вот эту тему, там я приводил код, который наглядно показывает работу блокировок. Только выполни все действия которые я там описал.
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
Materium |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 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"; |
|||
|
||||
korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Новичок. Попробуй вместо этого:
написать так:
Строку:
удали она не нужна, с файла будет снята блокировка после его закрытия. Это сообщение отредактировал(а) korob2001 - 9.12.2006, 03:12 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
Materium |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 4.12.2006 Где: Питер Репутация: нет Всего: 2 |
Спасибо, удаление символа конца строки помогло )))
Кста, эксперт, никто не знает... ? вот по правой кнопке мыши можно страницу просмотреть в штмл коде. Как сделать из своего сценария чтобы нельзя было людям просмотреть??? через Perl можно так сделать? или это Java VB Script-ы? --------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok"; |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Нет новичёк, из Perl нельзя, так как он работает на стороне сервера. Можно с JavaScript попробовать, примерно так:
Но это всё равно не защита, это так прикол. Кому будет нужно смогут открыть твой исходник HTML. Это сообщение отредактировал(а) korob2001 - 11.12.2006, 21:29 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
Materium |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 4.12.2006 Где: Питер Репутация: нет Всего: 2 |
Отличный у вас форум! Самый лучший.
Буду обращаться! Добавлено @ 23:20 А скрипт cgi могут люди смотреть как-нить? Если могут то как? Или это задача подсилу специалистам только? Я так понимаю чтобы просмотреть его нужно иметь права, чтобы войти, например, по ftp в мою папку на серваке. Но это уже подстать тому чтобы сделать всё что угодно с ресурсом ))) --------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok"; |
|||
|
||||
Materium |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 4.12.2006 Где: Питер Репутация: нет Всего: 2 |
Да Короб я попробовал скрипт. Неплохо, но в меню в браузере есть фишка та же - открыть в html. Не знаешь она отключается? Вообще это конечно не суть важно, но иногда не хотелось бы что-то показывать лишнее.
Вроде лучше дело обстоит с фреймами. в один я вставил скрипт, из менюшки браузера открывается соответственно в html скрипт, который и создаёт эти фреймы и всё. остальные защищены. --------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok"; |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Если права поставишь как у исполняемой программы, то не смогут, т.е. 0755. Ну и конечно же если дыр не будет. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 12 Всего: 84 |
Materium, скрыть html-код не под силу никому
![]() К примеру, скрипт который скрывает. В IE работает на ура, но можно же отключить js. Можно не показывать страничку если отключены js. Но есть и другие браузеры ![]() ![]() В общем либо я не встречал, либо реально такое не сделать ;) я остаюсь при своём мнении... ![]() Про CGI korob2001, всё правильно ответил, добавлять нечего. З.Ы.: если говорил мутно, спрашивай конкретно что не ясно. Спасибо за внимание ;) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: CGI программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |