PHP + MySQL Kuyruğu

3 Cevap php

I need a simple table that acts as a Queue. My MySQL server restriction is I can't use InnoDB tables, only MyISAM.

Müşteriler / işçi aynı anda çalışacak ve onlar her zaman değişik işlerini almak gerekir.

Benim fikrim aşağıdaki (pseudo-code) yapmaktır:

$job <- SELECT * FROM queue ORDER BY last_pop ASC LIMIT 1;
UPDATE queue SET last_pop WHERE id = $job->id
return $job

Ben masa kilidi ve "GET_LOCK" denemişti ama hiçbir şey happends, işçiler bazen aynı işleri alır.

3 Cevap

You need to turn your ordering around so there is no timing window.

Tüketici POP (her tüketici benzersiz $ consumer_id vardır)

Update queue 
set last_pop = '$consumer_id' 
where last_pop is null 
order by id limit 1;

$job = 
  Select * from queue 
  where last_pop = '$consumer_id' 
  order by id desc 
  limit 1;

Tedarikçi PUSH

insert into queue 
  (id, last_pop, ...) 
values 
  (NULL, NULL, ...);

Kuyruk id sütuna göre zamanında sipariş ve consumer_id yazan POP üzerine atanır.

Sadece bilgi için, orada kuyruğu yapmak yerine bir tablo Gearman kullanarak başka bir seçenek: Rasmus Lerdorf wrote a very nice article about it.

Oleg,

Çözelti doğrudur. $consumer_id işlemci için benzersiz bir tanımlayıcı olmalıdır. Eğer bir makine üzerinde çift cron işleri olsaydı, örneğin, consumer ID olarak pid kullanabilirsiniz.

GÜNCELLEME atom, yani consumed sizin ID tarafından olarak kuyrukta tam olarak bir satır işaretler.

Bazı uygulamalar için ben de bir durum alan var finished, böylece last_pop en consumer_id ayarlanır, ancak bitmiş bayrağı ayarlı değil ve iş X daha eski, o olabilir eğer yeniden başlatılması için işaretlenmiş.