webForumDet fria alternativet

Perl och PHP problem

1 svar · 480 visningar · startad av Blockqoute

BlockqouteMedlem sedan dec. 200380 inlägg
#1

Jag vill skriva en applikation i Perl som kan sammanställa en webbsida innehållande en tabell med ip-adresser och datum visande vilka som besökt en webbplats. Applikationen startas med hjälp av ett formulär på en separat webbsida.

Min sammanställning vill jag skall bestå av en resulterande webbsida där man bara ser vilket ip-nummer som läst webbplatsen samt det datum det skett. Om flera anrop till sidan skett vid näraliggande tidpunkt från samma ip-nummer ska bara det första anropet visas i sammanställningen.

Sammanställningen ska vara sorterad i datumordning med det mest aktuella datumet först i listan. Sammanställningen anropas från en button som skapar ett cgi-anrop och skapar resultatsidan "on the fly".

Jag har en länk till en påhittad access logg, den är: http://w3.miun.se/dtab37/lab/access_log.txt

Jag har fått detta att fungera i stora drag men inte riktigt, undrar om det är någon som kan säga mig vad jag borde ändra på.

Perl-koden ser ut som följande:

print "Content-Type:text/html\n\n";

# Sökvägen till loggfilen
open (FILE,"<../logs/access_log.txt");  # Öppnar filen för att hämta data.
@fildata=<FILE>;				# Lägger in datat i en array
close (FILE);					# Stänger filen	

# Skriver ut html kod

print "<table width='500'>";
print "<tr><td>IP nummer</td><td>Datum</td></tr>";
foreach $rad(reverse (@fildata))	# Loppar ut innehållet med en forsats, tar 
									# det bakvägen med reverse för att få det senaste överst.
{
	@rad=($rad=~m/(.*)index/);		# Söker reda på rader med statistik för index.html

	if($rad[0]){					# Om innehåll finns

	#Tar med allt tom först tecknet
	@rad=($rad=~m/(.*) "/);			
	($temp1, $temp3) = split(/ - - /, $rad[0]); # Splittar strängen i två delar för att presentera
												# det i en tabell på ett snygg sätt.

print "<tr><td>".$temp1."</td><td>".$temp3."</td><tr>"; # Skriver ut värdena.
	}
	
}
print "</table>";

HTML och PHP-koden ser ut som följande:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Laboration 3</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
 <p>Klicka p&aring; knappen f&ouml;r att se en sammanst&auml;llning &ouml;ver vilka ip adresser som bes&ouml;kt<br>
[url]http://www.ite.mh.se/~dhtml/index.html[/url]</p>
 <form name="form1" method="post" action="">
   <input type="submit" name="visa" value="Se sammanställning">
 </form>
 
 <? 
 if (isset($visa)) // Om knappen tryckts inkludera cgi skriptet. 
 include "laboration3.pl";
 ?>
 <p>&nbsp;</p>
</body>
</html>
HansenMedlem sedan aug. 2000374 inlägg
#2

Ger detta rätt "output"?

#!/usr/bin/perl

use strict;
use warnings;

use IO::File;

my @entries = extract_entries( 'access_log', quotemeta('/~dhtml/index.html') );

for my $entry (@entries) {
    printf( "%-20s %s\n", $entry->{host}, $entry->{datetime} );
}

sub extract_entries {
    my ( $log, $wanted ) = @_;

    my %seen   = ();
    my @result = ();
    my $regexp = qr/^(\S*) \S* \S* \[([^\]]+)\] "\w+ (.+) \S*"/;

    my $handle = IO::File->new;

    $handle->open( $log, O_RDONLY | O_SHLOCK )
      or die("Failed to open '$log': $!");

    while ( my $line = $handle->getline ) {

        if ( my ( $host, $datetime, $uri ) = $line =~ m/$regexp/ ) {

            if ( $uri =~ m/$wanted/ and not $seen{$host} ) {
                
                $seen{$host}++;
                
                push( @result, { host => $host, datetime => $datetime } );
            }

            next;
        }

        die("Unexpected line: $. in: '$log'");
    }

    $handle->close
      or die("Failed to close '$log': $!");

    return reverse @result;
}

output:

mundus:~/dev/perl/misc chansen$ ./parse.pl 
202.38.126.48        14/Sep/2000:23:22:51 +0200
199.172.149.134      13/Sep/2000:04:34:19 +0200
195.66.50.200        10/Sep/2000:11:02:06 +0200
213.100.81.144       03/Sep/2000:16:58:12 +0200
195.163.102.100      18/Aug/2000:12:54:41 +0200
212.187.226.111      11/Aug/2000:03:50:41 +0200
209.202.148.27       10/Aug/2000:04:22:50 +0200
212.75.67.35         09/Aug/2000:00:14:31 +0200
208.219.77.29        05/Aug/2000:10:48:30 +0200
132 ms totalt · 3 externa anrop · v20260731065814-full.c2d75422
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)