سؤال

لقد قبلت للتو سؤال مماثل (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 مواقع وعمليين يحتاج النظام إلى العمل مثل هذا:

      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.

كيف أقوم بذلك؟

هل كانت مفيدة؟

المحلول

ربما ترغب في تتبع قطعتين من المعلومات لكل موقع: عندما تم كشط آخر مرة وإذا كان يجري كشط حاليا.

باستخدام الإجابة لسؤالك الآخر، قم بتعيين scraping حقل معرف العامل لقفله من العمال الآخرين. عندما ينتهي العامل مع المهمة تعيين scraping حقل العودة إلى 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';

نصائح أخرى

لماذا لا تضيف حالة عمود منطقية إضافية بحيث يمكنك طلبها بواسطة Last_Pop. لذلك عند تحديد موقع من قبل عامل للتغذية تشغيل استعلام ثان UPDATE site SET status = '1'. وبعد وعندما يختار العامل التالي الموقع التالي تشغيل استعلام SELECT * FROM site WHERE status = '0' ORDER BY last_pop ASC.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top