PHP + قائمة انتظار دورة MySQL
سؤال
لقد قبلت للتو سؤال مماثل (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
.