2009-11-06 1 views
1

난 그냥 비슷한 질문 (PHP + MySQL Queue)를 받아,하지만 난 내 문제에 대한 올바른 질문이 아니라는 것을 깨달았지만, 내 질문 :PHP는 + MySQL을주기 큐

에 대한 정답이었다 나는이 MySQL (MyISAM 유형) 사이트에서 작업자가 긁어내는 테이블.

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; 

내가 필요한 것은 반복없이 작업자 한 곳을 스크랩하는 것입니다. 내가 3 개 사이트와 2 명 근로자가있는 경우 그래서, 시스템은 다음과 같은 작업을 할 필요가 :

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

그것은 last_pop ASC에 의한 순환 큐 주문자 같다.

어떻게하면됩니까?

답변

1

각 사이트에 대해 마지막으로 긁힌 정보와 현재 긁힌 정보의 두 가지 정보를 추적하고 싶을 것입니다.

다른 질문에 대한 대답을 사용하여 scraping 필드를 다른 작업자로부터 잠그기 위해 작업자의 ID로 설정하십시오. 작업자가 작업을 마쳤 으면 필드를 null으로 다시 설정하고 last_scrape 날짜를 현재 시간으로 설정합니다.

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; 

잠금 및 다음 작업 검색 (마지막으로 사이트가 가장 긴 시간 전에 긁어) : 다시

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' 

릴리스 작업이 대기열 :

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

당신이 잠재적으로 결합 할 수있는 값이 충돌하지 않는 한 타임 스탬프 및 스크래핑 상태의 사용. 100 명의 작업자가 있다면 'last_scape'> 101 인 작업을 선택하고 100까지의 작업자 ID에'last_scrape '을 설정하여 작업을 처리하도록 지정하십시오. 필드를 더 큰 값으로 초기화해야합니다. 그렇지 않으면 필드가 이미 모든 작업자에게 잠겨져있는 것처럼 보일 수 있습니다. – gapple

+0

그 정도면 충분합니다. 감사. – inakiabt

0

왜 LAST_POP로 주문할 수 있도록 여분의 부울 열 STATUS를 추가하지 않습니까? 따라서 작업자가 폐품 처리를 위해 사이트를 선택하면 UPDATE site SET status = '1'이라는 두 번째 쿼리가 실행됩니다. 그리고 다음 작업자가 다음 사이트를 선택할 때 SELECT * FROM site WHERE status = '0' ORDER BY last_pop ASC이라는 쿼리를 실행하십시오.