Передо мной была поставлена задача создать «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();
Будет ли приведенный выше пример правильным способом использовать MySQL? TRANSACTION
особенность и заверить ВСЕ параллельными запросами выделены разные строки?
Вам нужен столбец в таблице, который указывает, что строка используется одним из процессов искателя. Ты первый 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
,
Других решений пока нет …