我被赋予创建完全依赖于数据库内部代理的“ Mass Crawler”的任务。这是我要实现的目标的简单概述:
我已经研究过TRANSACTIONS
mySQL,但是我仍然相信这样做无济于事,因为查询将在每个爬网程序的确切相同时间执行。
我对单个搜寻器文件的想法是这样的:
$db = new MysqliDb("localhost", "username", "password", "database");
$db->connect();
$db->startTransaction();
$db->where("last_used", array("<" => "DATE_SUB(NOW(),INTERVAL 30 SECOND)"));
$proxies = $db->get("proxies", 1);
if(count($proxies) == 1) {
//complete any scraping that needs to be done
//update the database to say the proxy has just been used
$db->where("id", $accounts[0]['id']);
$db->update("proxies", array("last_used", date("Y-m-d H:i:s")));
//commit the complete transaction
$db->commit();
}
$db->disconnect();
上面的示例是否是使用mySQLTRANSACTION
功能并确保所有并行查询选择不同行的正确方法?
您需要在表中的一列指示该搜寻器进程之一正在使用该行。您的第一个SELECT
应该寻找WHERE in_use = 0
; 但是,它需要使用FOR UPDATE
子句来锁定处理的行。
SELECT *
FROM proxies
WHERE in_use = 0
LIMIT 1
FOR UPDATE;
我不知道如何使用您正在使用的数据库API编写该查询;您可能需要使用其功能来执行原始查询。
然后将该行更新为SET in_use = 1
。通过在事务中执行两项操作,可以确保没有其他进程将获得该行。
处理完行后,就可以了SET in_use = 0
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句