Как правильно реализовать PHP парсер больших объемов информации?

Привет свежим тостам) Возник очередной, сомнительный для меня как новичка вопрос. Есть источник, как оттуда вытянуть информацию (именно так как мне нужно), я разобрался. Все работает, даже лучше чем надо, но есть один нюанс, когда я обрабатываю информацию в цикле до 50 страниц, все работает нормально. Но мне нужно как минимум выгрузить больше 200 страниц, а в будущем может быть и больше 600. Что бы снизить нагрузку на базу, я изначально забрасываю все в массив, потом загружаю одним большим запросом в базу.

Палю код:

<?php
include 'settings/functions.php';
function curl( $url ) {
$ua=curl_init();
curl_setopt($ua, CURLOPT_URL, $url);
curl_setopt($ua, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ua, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ua, CURLOPT_USERAGENT, 'User-Agent:Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.75 Safari/537.1\r\n');
curl_setopt($ua, CURLOPT_HTTPHEADER, array('Content-type: text/html'));
return curl_exec($ua);
}
require_once 'simple_html_dom.php'; // врубаем парсер
$mass = array();
$more_info = $mysqli->query("SELECT id, tag, name FROM info WHERE source<>'' LIMIT 1");
while($info = mysqli_fetch_array($more_info)) {
$html = str_get_html(curl('http://сайт_потерпевший/'.$info['tag'].'/'));
foreach ($html->find('главный_тег') as $article) {
$id++;
foreach ($article->find('внутренний_тег') as $article) {
$mass[] = "('".$info['id']."','".$id."','".$article->find("time", 0)->plaintext."','".$article->find("span._title", 0)->plaintext."')";
}
}
}
echo implode(',', $mass);
if ($mass) {
$mysqli->query("INSERT INTO new_info (info_id, day, time, name) VALUES ".implode(',', $mass).";");
}
?>


Есть мысль, каждую странницу приравнивать с get параметром и передавать результат в сессию. Подскажите ребятки, очень нуждаюсь в срочном решении.
  • Вопрос задан
  • 2041 просмотр
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Message Queue, лог обработанных страниц, демон который будет все это добро обрабатывать, скрипт который будет заносить задачи на обработку в очередь. Так же можно для гибкости вынести в отдельную очередь запись результатов в базу (или вообще хранить временно в redis каком). Тогда больше простора для масштабирования.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 20:43
20000 руб./за проект
19 апр. 2024, в 20:11
500 руб./за проект