juli: ipliste auswerten

Hi Männer,

ich hab mal wieder eine frage. ich will eine datei mit ips auswerten wie oft welche geklickt wurde. das ergebnis ist dann später eine htmltabelle. je nach wie oft wird die farbe noch geändert. das klappt auch. aber mun sollen die ips noch aufgeteilt angezeigt werden, also von aaa.bbb.ccc.ddd jede teilnummer in einer eigenen spalte in der tabelle. die anzahlanzeige bleibt aber auf die vollständige nummer beschränkt. aber wenn jetzt aaa.bbb auch schon mehrmals war, will ich die farbe auch ändern.

jetzt komm ich mit dem aufbau des arrays in php nicht klar, wie ich das am besten machen muss, damit ich gleich die anzahl habe für die farbwahl wenn die zeile dran ist mit der ausgabe. das sind je jetzt vier felder für die ich die anzahl wissen muss pro zeile.

versteht mich einer? ich weiß jedenfalls nicht mehr weiter.

danke schonmal

juli

  1. Moin!

    Willst Du das wirklich? "Bald" kommt nämlich flächendeckend IPv6 und ich bezweifle begründet, dass sich der Spaß - hinter dem ich auch keinerlei Nutzen sehe - dann noch auf einem ordinären Webserver speichern lässt.

    Jörg Reinholz

    1. hi,

      Willst Du das wirklich? "Bald" kommt nämlich flächendeckend IPv6 und ich bezweifle begründet, dass sich der Spaß - hinter dem ich auch keinerlei Nutzen sehe - dann noch auf einem ordinären Webserver speichern lässt.

      ja, will ich. bald ist auch wieder weihnachten und ich will trotzdem vorher noch am strand liegen :-P

      lg juli

      1. Moin!

        Na dann: (In PHP)

        Kannst ja probieren. (ERST ALLES LESEN!)

        <?php
        for ($i=1; $i < 256; $i++) {
           $classA[$i]=0;
           $classB[$i]=array();
           $classC[$i]=array();
           $classD[$i]=array();
           for ($k=1; $k < 256; $k++) {
               $classB[$i][$k]=0;
               $classC[$i][$k]=array();
               $classD[$i][$k]=array();
               for ($l=1; $l < 256; $l++) {
                  $classC[$i][$k][$l]=0;
                  $classD[$i][$k][$l]=array();
                  for ($m=1; $m < 256; $m++) {
                      $classD[$i][$k][$l][$m]=0;
                  }
               }
           }
        }
        

        Ungefähr das hier passiert, wenn jede IP(v4) einmal "klickt":

        Das Skript hat Speicher ohne Ende gebraucht und auf meinem System zur Nutzung von 12GB RAM geführt. Mit einer langsamen Platte hätte ich aufgeben können. (SWAP!)

        Zeiten:

        real    1m39.223s
        user    1m3.586s
        sys     0m11.457s
        

        Dafür habe ich es jetzt schön warm.

        Versuchen wir es anders herum:

        <?php
        $classA=array();
        $classB=array();
        $classC=array();
        $classD=array();
        
        $handle = fopen("/tmp/inputfile.txt", "r");
        if ($handle) {
            while (($buffer = fgets($handle, 4096)) !== false) {
                $row=trim($buffer);
                if ($row) {
                    list($a, $b, $c, $d) = explode('.', $row);
                    if (! isset($classA[$a]) ) {
                        $classA[$a]=1;
                    } else {
                        $classA[$a]++;
                    }
        
                    if (! isset($classB[$a]) ) { $classB[$a]=array(); }
                    if (! isset($classB[$a][$b]) ) {
                        $classB[$a][$b]=1;
                    } else {
                        $classB[$a][$b]++;
                    }
        
                    if (! isset($classC[$a][$b]) ) { $classC[$a][$b] = array(); }
                    if (! isset($classC[$a][$b][$c]) ) {
                        $classC[$a][$b][$c]=1;
                    } else {
                        $classC[$a][$b][$c]++;
                    }
        
                    if (! isset($classD[$a][$b][$c]) ) { $classD[$a][$b][$c] = array(); }
                    if (! isset($classD[$a][$b][$c][$d]) ) {
                        $classD[$a][$b][$c][$d]=1;
                    } else {
                        $classD[$a][$b][$c][$d]++;
                    }
                }
            }
            fclose($handle);
        } else {
           echo "da war nichts zu lesen...";
        }
        
        print "\nA: ";
        print_r($classA);
        print "\nB: ";
        print_r($classB);
        print "\nC: ";
        print_r($classC);
        print "\nD: ";
        print_r($classD);
        

        liefert mit 27 Zeilen "192.168.1.2" erwartungsgemäß:

        A: Array
        (
            [192] => 27
        )
        
        B: Array
        (
            [192] => Array
                (
                    [168] => 27
                )
        )
        
        C: Array
        (
            [192] => Array
                (
                    [168] => Array
                        (
                            [1] => 27
                        )
                )
        )
        
        D: Array
        (                                                                                                                                                   
            [192] => Array
                (                                                                                                                                           
                    [168] => Array                                                                                                                          
                        (                                                                                                                                   
                            [1] => Array                                                                                                                    
                                (                                                                                                                           
                                    [2] => 27                                                                                                               
                                )                                                                                                                           
                        )
                )
        )
        

        und geht ziemlich fix:

        real    0m0.046s
        user    0m0.026s
        sys     0m0.017s
        

        ... sollte also ungefähr das sein, was Du willst.

        Jörg Reinholz

        1. Moin!

          Mit einer Textdatei aus einer kleinen DDoS-Attacke und 201716 Zeilen, 2.851.041 Bytes (nur IP-Adressen):

          real    0m0.986s
          user    0m0.813s
          sys     0m0.105s
          

          ( ... und ohne Ausgabe der Arrays:)

          real    0m0.841s
          user    0m0.827s
          sys     0m0.012s
          

          Jörg Reinholz

          1. hi ho jörg,

            danke für das beispiel. ich krieg das jetzt wohl hin. muss nur noch ein bisschen das php und html sortieren. sonst steigt hier bei mir keiner mehr durch :-O

            ich hätte dir gerne punkte gegeben, aber das geht nicht.

            liebe grüße juli

            1. Hallo

              ich hätte dir gerne punkte gegeben, aber das geht nicht.

              Ja, dazu musst du registriert und angemeldet sein. Du solltest aber Antworten als die Antworten akzeptieren können. Das hülfe später Suchenden und verhülfe Jörg auch zu Punkten.

              Tschö, Auge

              --
              Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
              Terry Pratchett, „Gevatter Tod“