Frage

Ich nahm nur eine ähnliche Frage ( PHP + MySQL Queue ), aber ich erkennen, dass es wasn ‚t die richtige Frage für mein Problem, aber es war die richtige Antwort für meine Frage:)

Ich habe eine MySQL (MyISAM-Typ) Tabelle Websites von Arbeitern gekratzt werden.

CREATE TABLE `site` (
  `id` int(11) NOT NULL auto_increment,
  `url` text,
  `last_pop` int(13) default NULL,
  `md5` varchar(32) default NULL,
  `disabled` tinyint(1) default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `md5` (`md5`),
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

Was ich brauche, ist ohne Wiederholung einer Website pro Arbeiter verschrotten. Also, wenn ich 3 Standorte und 2 Arbeiter muss das System so arbeiten:

      ID URL   LAST_POP
t4    1  site1 t1         <- worker1 scrap site1
t4    2  site2 t2         <- worker2 scrap site2
t5    3  site3 t3         <- worker1 scrap site3
t6    1  site2 t4         <- worker2 scrap site2
t6    2  site1 t4         <- worker1 scrap site1
t7    3  site3 t5         <- worker2 scrap site3
....

Es ist wie ein radelte Warteschlange Besteller durch last_pop ASC.

Wie kann ich das tun?

War es hilfreich?

Lösung

Sie werden wahrscheinlich wollen für jeden Standort Spur von zwei Informationen zu halten: wenn es zuletzt war abgeschabt und wenn es zur Zeit abgeschabt wird

.

die Antwort für Ihre andere Frage verwenden, setzen Sie auf die ID des Arbeiter das scraping Feld, um es von anderen Arbeitern zu sperren. Wenn der Arbeiter mit der Aufgabe stellen Sie das scraping Feld beendet ist zurück auf die aktuelle Zeit null und das last_scrape Datum.

CREATE TABLE `site` (
  `id` int(11) NOT NULL auto_increment,
  `url` text,
  `last_scrape` TIMESTAMP,
  `scraping` tinyint(1) default NULL,
  `md5` varchar(32) default NULL,
  `disabled` tinyint(1) default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `md5` (`md5`),
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

Sperren und rufen Sie die nächste Aufgabe (die Website, die die letzte Mal vor der längsten Zeit abgeschabt wurde):

Update site
  set `scraping` = '$worker_id' 
  where `scraping` is null 
  order by `last_scrape` ASC limit 1;

$job = 
  Select * from site
  where `scraping` = '$worker_id'

Veröffentlichungs Job zurück zur Warteschlange:

Update site
  set `scraping` = NULL,
  `last_scrape` = NOW()
  where `scraping` = '$worker_id';

Andere Tipps

Warum eine zusätzliche boolean Spalte STATUS nicht hinzufügen, so dass Sie von LAST_POP bestellen können. Also, wenn eine Website von einem Arbeiter ausgewählt für die Verschrottung eine zweite Abfrage mit UPDATE site SET status = '1' laufen. Und wenn der nächste Arbeiter die nächste Seite wählt eine Abfrage mit SELECT * FROM site WHERE status = '0' ORDER BY last_pop ASC laufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top