Задать вопрос

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

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

Похожие вопросы