tmmmd: Array vergleichen aus gleicher funktion

Hallo,

ich habe eine Funktion die in einer Endlosschleife läuft. Hierbei wird von einer anderen Webseite eine Liste von Wörtern geholt und in ein array gepackt und abschließend in die Datenbank.

Soweit perfekt. Nun kann es aber vorkommen das ich beim nächsten aufruf (Script läuft ja wie gesagt in einer Endlosschleife) die gleichen Daten wieder bekommen und ich somit meine Daten in der Datenbank verfälsche, da ich den gleichen Datensatz ja schon einmal hatte.

Im normallfall würde ich mit dem array_diff ja solche Sachen perfekt glattbügeln können. Aber wie füge ich diese Erinnerungsfunktion ein?
Ich könnte den Vorgang (doit) einfach kopieren (also fetch und noch einmal ausführen) würde dann aber bei jedem zweiten mal keinen Vergleich machen können.

Habt ihr da eine Idee? Hier mein Quelltext:

  
while(1) {  
	doit($snoopy);  
}  
  
function doit($snoopy) {  
	$snoopy->fetch("http://meine-domain.de/aktuelle-News");  
	$inhalt = $snoopy->results;  
	preg_match_all("|<span>(.*)</span>|Uism",$inhalt, $items, PREG_PATTERN_ORDER);  
  
        print_r($items[1]);  
	usleep(300000);  
}
  1. Du mußt noch mal erklären was wovon nicht doppelt sein soll. Grundsätzlich klingt das aber so als wäre unique für die Datenbank das Richtige.

    1. Du mußt noch mal erklären was wovon nicht doppelt sein soll. Grundsätzlich klingt das aber so als wäre unique für die Datenbank das Richtige.

      Hallo,

      es geht darum das Ergebnis was in $items[1] gespeichert ist beim nächsten Aufruf mit sich selbst zu vergleichen also
      array_diff($items[1]jetzt, $items[1]vorher);

      1. Du mußt noch mal erklären was wovon nicht doppelt sein soll. Grundsätzlich klingt das aber so als wäre unique für die Datenbank das Richtige.

        Hallo,

        es geht darum das Ergebnis was in $items[1] gespeichert ist beim nächsten Aufruf mit sich selbst zu vergleichen also
        array_diff($items[1]jetzt, $items[1]vorher);

        Weißt Du, Du mußt auch nicht, ich muß aber auch nicht antworten.

        Noch ein Versuch:
        Es geht um Wörter (also wie auch immer definierte Teile) ein und der selben Seite, die sich aber vielleicht verändert, richtig?
        Soll jedes Wort nur ein mal im Array/Datenbank sein, oder sollen Wörter auch doppelt im Array/Datenbank sein aber neue Wörter sollen nur hinzukommen, wenn sich was ändert und wörter noch nicht im Array sind?
        Was ist die Datenbank für eine Datenbank?
        Hast du recherchiert was "unique" in Bezug auf Datenbanken bedeutet?

        Im Übrigen kann ich nicht erkennen wo das Problem bei der Umsetzung liegt, also wie machst du es bisher und was paßt Dir am Ergebnis nicht?

        1. Noch ein Versuch:
          Es geht um Wörter (also wie auch immer definierte Teile) ein und der selben Seite, die sich aber vielleicht verändert, richtig?

          JA

          Soll jedes Wort nur ein mal im Array/Datenbank sein, oder sollen Wörter auch doppelt im Array/Datenbank sein aber neue Wörter sollen nur hinzukommen, wenn sich was ändert und wörter noch nicht im Array sind?

          Es sollen die Wörter mehrfach in der Datenbank gespeicher sein, ich möchte nur ausschließen, das ich ein und den gleichen Datensatz (also zwei getrennte Webseiten aufrufe innerhalb weniger Sekunden mit gleichen Dateninhalten) zwei mal abspeichere.

          Was ist die Datenbank für eine Datenbank?

          MYSQL InnoDB

          Hast du recherchiert was "unique" in Bezug auf Datenbanken bedeutet?

          Ja ein Eintrag ist in der Entsprechenden Spalte unter bestimmten Bedingungen nur einmal vorhanden.

          Im Übrigen kann ich nicht erkennen wo das Problem bei der Umsetzung liegt, also wie machst du es bisher und was paßt Dir am Ergebnis nicht?

          Mir passt das Ergebnis nicht, da ich in wenigen Sekunden den gleichen Datensatz mehrmals abspeicher weil ich ihn mit dem vorherigem Datensatz nicht abgleichen kann...

          1. Hi!

            Es sollen die Wörter mehrfach in der Datenbank gespeicher sein, ich möchte nur ausschließen, das ich ein und den gleichen Datensatz (also zwei getrennte Webseiten aufrufe innerhalb weniger Sekunden mit gleichen Dateninhalten) zwei mal abspeichere.

            Dann also doch Session. Aber wer erzeugt die Requests? Immer der selbe Client oder unterschiedliche? Natürlich kann man eine Session auch für alle Clients verwenden, wenn man als Session-ID einen festen Wert nimmt und keinen zufällig für jeden Client ermittelten. Wie aber unterscheidest du "gleiche Datensätze"? Lässt du ein bedeutendes Unterscheidungsmerkmal beim Ablegen im DBMS weg, so dass die ein Unique Index nichts bringt und du nur die Quelldaten dazu auswerten kannst?

            Lo!

            1. Dann also doch Session. ...

              Sind Dir die Zeilen
              while(1)
              und
              usleep(300000);
              entgangen?

              1. Hi!

                Dann also doch Session. ...

                Sind Dir die Zeilen
                while(1)
                und
                usleep(300000);
                entgangen?

                Anfänglich ja, aber wie würdest du diese Aussage interpretieren: "also zwei getrennte Webseiten aufrufe innerhalb weniger Sekunden mit gleichen Dateninhalten"?

                Lo!

                1. aber wie würdest du diese Aussage interpretieren: "also zwei getrennte Webseiten aufrufe innerhalb weniger Sekunden mit gleichen Dateninhalten"?

                  So: Ein _ein_mal_ aufgerufenes script ruft in diesem Aufruf mehrere Seiten mit Abstand mehrfach auf.

                  1. Hi!

                    aber wie würdest du diese Aussage interpretieren: "also zwei getrennte Webseiten aufrufe innerhalb weniger Sekunden mit gleichen Dateninhalten"?

                    So: Ein _ein_mal_ aufgerufenes script ruft in diesem Aufruf mehrere Seiten mit Abstand mehrfach auf.

                    OK, zusammen mit dem Text des Ausgangspostings, denke ich es nun verstanden zu haben (wenn man denn immer gleich richtig lesen tät …). Es kommen also von anderswo manchmal doppelte Daten, die es nur einmal zu verarbeiten gilt. Da allerdings auch mal was dazwischen kommt und das Endlos-Script abgebrochen werden muss, und damit alle Variablen verlustig gehen, wäre eine persistente Speicherung der "Das hab ich schon verarbeitet"-Information sinnvoll, wofür sich dann doch unter anderem eine Session (mit fester Session-ID) anbietet. Ansonsten wäre die Frage zu klären, ob nicht vielleicht von den geholten Daten ein Hash-Wert berechnet werden könnte, und dieser gespeichert wird. Das verringerte die zu merkende Datenmenge unter Umständen erheblich.

                    Lo!

          2. Noch ein Versuch:
            Es geht um Wörter (also wie auch immer definierte Teile) ein und der selben Seite, die sich aber vielleicht verändert, richtig?

            JA

            Soll jedes Wort nur ein mal im Array/Datenbank sein, oder sollen Wörter auch doppelt im Array/Datenbank sein aber neue Wörter sollen nur hinzukommen, wenn sich was ändert und wörter noch nicht im Array sind?

            Es sollen die Wörter mehrfach in der Datenbank gespeicher sein, ich möchte nur ausschließen, das ich ein und den gleichen Datensatz (also zwei getrennte Webseiten aufrufe innerhalb weniger Sekunden mit gleichen Dateninhalten) zwei mal abspeichere.

            Was denn nun, ein und die selbe Seite oder mehrere Seiten?

            Was ist die Datenbank für eine Datenbank?

            MYSQL InnoDB

            Hast du recherchiert was "unique" in Bezug auf Datenbanken bedeutet?

            Ja ein Eintrag ist in der Entsprechenden Spalte unter bestimmten Bedingungen nur einmal vorhanden.

            Warum speicherst Du keinen String aus den Wörtern (bei mehreren Seiten als unique in der DB? Was versprichst Du Dir davon die Wörter in einem Array vorliegen zu haben? Nicht zuletzt könnten bei deiner Methode zwei sehr unterschiedliche Seiten als gleich erkannt werden, wenn das auch unwahrscheinlich ist.

            Im Übrigen kann ich nicht erkennen wo das Problem bei der Umsetzung liegt, also wie machst du es bisher und was paßt Dir am Ergebnis nicht?

            Mir passt das Ergebnis nicht, da ich in wenigen Sekunden den gleichen Datensatz mehrmals abspeicher weil ich ihn mit dem vorherigem Datensatz nicht abgleichen kann...

            Hältst du das wirklich für eine Antwort auf meine Frage?

      2. Hi!

        es geht darum das Ergebnis was in $items[1] gespeichert ist beim nächsten Aufruf mit sich selbst zu vergleichen also
        array_diff($items[1]jetzt, $items[1]vorher);

        Üblicherweise persistiert (= aufheben) man Werte zwischen zwei Requests in einer Session.

        Wobei mir aber auch ein Unique-Index in der Datenbank als die sicherere Methode erscheint.

        Lo!

        1. Hi!

          es geht darum das Ergebnis was in $items[1] gespeichert ist beim nächsten Aufruf mit sich selbst zu vergleichen also
          array_diff($items[1]jetzt, $items[1]vorher);
          Üblicherweise persistiert (= aufheben) man Werte zwischen zwei Requests in einer Session.

          Ah, falscher Kontext. Mit "Aufruf" war Funktionsaufruf und nicht Aufruf durch Browser gemeint. Dann eine Variable.

          Lo!

      3. Hi,

        es geht darum das Ergebnis was in $items[1] gespeichert ist beim nächsten Aufruf mit sich selbst zu vergleichen also
        array_diff($items[1]jetzt, $items[1]vorher);

        ja, und wo ist das Problem dabei?

        Dass du $items[] in jedem Durchlauf speicherst, damit du in der nächsten Runde noch den alten Wert zur Verfügung hast, ist natürlich Voraussetzung für einen vorher-jetzt-Vergleich.

        So long,
         Martin

        --
        Eifersucht ist so alt wie die Menschheit: Als Adam einmal spät heimkam, zählte Eva sofort seine Rippen.