@BushaevDenis

Как распараллелить процессы php?

Есть скрипт
include 'shd.php';
include 'table.php';
  $n = 1;
  $i = 1;
while ($i<=5){
  $html = file_get_html('http://somesite.ru/search/?page='.$i);
  $alink = $html->find('div.product-info a');
  foreach ($alink as $link){
    echo '<tr>';
    echo '<td>'. $n++ .'</td>'; //Номер
    $prod = file_get_html('http://somesite.ru'.$link->href);
    $title = $prod->find('h1.product-name');
    echo '<td>' . $title[0]->plaintext . '</td>';	//Название
    $keywords = $prod->find('meta[name=Keywords]');
    echo '<td>' . $keywords[0]->content . '</td>';	//Ключевики
    echo '<td>r</td>'; //Тип товара
    $descr = $prod->find('div.tab-content #tab1');
    echo '<td>' . htmlentities($descr[0]->innertext) . '</td>';	//Описание
    $aimage = $prod->find('div.image a');
    foreach ($aimage as $himage){
      $image .= 'http://somesite.ru' . $himage->href . ', '; //картинощки
    }
    echo '<td>' . rtrim($image,',') . '</td>';
    $price = $prod->find('div.add2cart span.price');
    echo '<td>' . str_replace(' Р','',$price[0]->plaintext) . '</td>';	//Цена
    echo '<td>RUB</td>'; //Тип товара
    echo '<td>шт.</td>'; //Тип товара
    echo '<td>+</td>'; //Тип товара
    $group = $prod->find('ol.breadcrumb li');
    echo $group[($prod)-2]->plaintext;	//Группа
    $aspec = $prod->find('tr td');
    foreach ($aspec as $spec){
      echo '<td>' . $spec->innertext.'</td><td></td>';
    }
  echo '</tr>';
  include 'clean.php';
  $prod->clear();	
  }
  $i++;
  $html->clear();
  $alink = none;
}
echo '</table>';


На 1 страницу парсинга уходит 200-300 секунд. Нужно спарсить 200 страниц. Выходит очень долго. Поэтому вопрос таков- как распаралелить это дело. Чтоб он, например, сразу 5 страниц начал парсить
  • Вопрос задан
  • 622 просмотра
Пригласить эксперта
Ответы на вопрос 4
Pinsky
@Pinsky
Кофеиноникотиновая смесь в backend-код
один поток собирает ссылки, складывает в очередь.

Запускаете сколько нужно обработчиков, каждый из которых:
1. достает одну запись из очереди
2. собирает инфу
3. сохраняет в бд
4. возвращается к пункту 1.

Если это дело бегает на одной машине - то можете использовать SysV очереди сообщений.
Ответ написан
Комментировать
LINKeRxUA
@LINKeRxUA
web dev
Я бы делал так:
Сперва собрать в таблицу БД коллекцию ссылок для обработки парсером. По завершению - не через file_get_html() а через мультипоточный cURL запросить контент и сохранить его в базу. По завершению - в цикле пробежаться по таблице и порциями в 20 записей выбирать id не обработанных парсером записей и тем же мультикурлом запросить другой урл для обработки, к примеру "/parser.php?id=1" .../parser.php?id=20"
Каждый из 20 запросов будет работать паралельно.

Скорее всего у вас проблема не в парсинге а соединении. По-этому мультикурл вам поможет, так как это подобно открытию страниц одновременно в нескольких вкладках браузера, а ваш код - это работ в одном окне и в одной вкладке.

И между прочем расставьте метки времени в своем коде для профилирования и отсчета времени на операцию. и вы будете знать наверняка, что заняло больше времени.
Ответ написан
Комментировать
@tommy_13
ну запусти 5 процессов сразу
Ответ написан
pcntl вам в помощь :)
А еще можно прикрутить pthreads и сделать пул воркеров
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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