PHP + MySQL Döngüsü Kuyruğu

2 Cevap php

Ben sadece bir benzer soru (http://stackoverflow.com/questions/1690748/php-mysql-queue) kabul, ama benim sorun için doğru soru değildi, ama benim soru için doğru cevabı olduğunu fark :)

Ben işçiler tarafından kazınarak sitelerin MySQL (MyISAM tip) tablo var.

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;

What I need is to scrap one site per worker without repeat. So, if I have 3 sites and 2 workers the system needs to work like this:

      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
....

Bu last_pop ASC tarafından devirli kuyruk düzenleyinin gibi.

Bunu nasıl yapabilirim?

2 Cevap

Muhtemelen her site için bilgi iki adet takip etmek istersiniz: Geçen kazınmış iken ve şu anda kazınmış olup olmadığını.

Diğer soru için cevabı kullanarak, diğer işçiler onu kilitlemek için işçinin id scraping alanını ayarlayın. Görevin geri null için scraping alanını ve şimdiki zaman last_scrape tarih ile işçinin bittiğinde.

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;

Kilit ve sonraki işi (son önce uzun zaman kazındı site) almak:

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'

Geri kuyruğuna işi bırakın:

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

Eğer LAST_POP tarafından sipariş böylece Neden ekstra bir boolean sütun Durum eklemeyin. Yani bir site ile ikinci bir sorgu çalıştırmak hurdaya çıkarılması için bir işçi tarafından seçildiğinde UPDATE site SET status = '1'. Ve sonraki işçi sonraki site ile bir sorgu çalıştırdığınızda seçtiğinde SELECT * FROM site WHERE status = '0' ORDER BY last_pop ASC.