|
|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Alan Long 2:5030/1082.72 16 Jan 2002 05:03:29 To : Alan Long Subject : многократный submit данных --------------------------------------------------------------------------------
* Originally from Alan Long (2:5030/1082.72) to All.
[...]
С помощью ценных советов здесь присутствующих, я решил данную задачу, вот мое
решение:
- --
sub dupe_check {
my $str = shift;
my $rc = 0;
local *IN;
open( IN, "+< $FileName" ) and do {
if( flock( IN, 2 ) ) {
local $_;
my ( $id, $expire, %table );
my $now = time();
while( <IN> ) {
chop;
my( $id, $expire ) = split ' ';
$table{$id} = $expire
if( $expire > $now );
}
if( defined $table{$str} ) {
$rc = $table{$str};
} else {
$table{$str} = $now + $TimeOut;
seek( IN, 0, 0 );
while( ($id, $expire) = each %table ) {
print IN join(' ', $id, $expire ), "\n";
}
truncate( IN, tell( IN ) );
}
} else {
$rc = $TimeOut;
# Hи как не решу, насколько это правильно.
}
close( IN );
}
return $rc;
}
- --
Использует две внешние переменные:
$FileName - файл доступный на запись, где хранится вся информация
$TimeOut - на какой срок игнорировать дублирующие сообщения.
использование:
my $sender = join(' ', $q->remote_addr(), $ENV{HTTP_X_FORWARDED_FOR} || ''
);
my $to = $q->param( 'to' );
my $msg = $q->param( 'msg' );
my $rc = dupe_check( md5_hex( join('', $to, $msg, $sender ) ) );
if( $rc ) {
...
print "<p>Сообщение сейчас отправляется, подождите $rc секунд...</p>";
...
} else {
send_message( $to, $msg, $sender );
}
Всем большое спасибо. критика функции dupe_check - приветствуется. Да, написал
по памяти, так что возможны синтаксические ошибки, но принцип работы именно
такой.
--
With best,
Ъ-· Ъ
Е-ЧLaі\і <alan@x-rays.eu.org>
--- timEd/386 1.10+
* Origin: X - Rays Station (2:5030/1082.72)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/4581c44d4000.html, оценка из 5, голосов 10
|