Использование multi curl для очистки около 300000 URL-адресов останавливает xampp от ответа (PHP

#php #xml #curl

#php #xml — файл #curl

Вопрос:

У меня есть XML-документ, который содержит более 300 000 URL-адресов (loc).

fulltest.xml (до 300 000 loc) — сократить до одного примера

     <?xml version="1.0" encoding="utf-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
    <url>
        <loc>http://url.com/122122-rob-jones?</loc>
        <lastmod>2014-05-05T07:12:41 08:00</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.9</priority>
    </url>
    </urlset>
  

С помощью этих 300 000 URL-адресов я пытаюсь очистить данные от использования multi_curl

index.php (сбор URL-адресов из XML-документа, затем использование mutl curl для очистки данных из них

 <?php
ini_set('memory_limit', '-1');
include 'config.php';
include 'SimpleLargeXMLParser.class.php';




$xml = dirname(__FILE__)."/fulltest.xml"; // 26969 URLS
$parser = new SimpleLargeXMLParser();
$parser->loadXML($xml);
$parser->registerNamespace("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9");
$array = $parser->parseXML("//urlset:url/urlset:loc");




$node_count = count($array);
$curl_arr = array();
$master = curl_multi_init();
// total: 26969
for($i = 0; $i < $node_count; $i  )
{
    $url =$array[$i];

    $curl_arr[$i] = curl_init($url);
    curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl_arr[$i], CURLOPT_HEADER, 0);
    curl_setopt($curl_arr[$i], CURLOPT_CONNECTTIMEOUT, 120);
    curl_multi_add_handle($master, $curl_arr[$i]);

}

do {
    curl_multi_exec($master,$running);
} while($running > 0);

for($i = 0; $i < $node_count; $i  )
{

    $results = curl_multi_getcontent  ( $curl_arr[$i]  );

    // Player ID

      $playeridTAG = '/<input type="checkbox" id="player-(. ?)" name="player" value="(. ?)" class="player-check" />/';
    preg_match($playeridTAG, $results, $playerID);      

    // End Player ID

    // more values to be added once working.


    $query = $db->query('SELECT * FROM playerblank WHERE playerID = '.$playerID[1].'');
    if($query->num_rows == 0) {

 $db->query('INSERT INTO playerblank SET playerID = '.$playerID[1].'') or die(mysqli_error($db));


    }


}


?>
  

Этот скрипт работает, если я ограничиваю URL-адреса примерно 1000, что было бы лучшим способом выполнить то, что я пытаюсь, с таким количеством URL-адресов без того, чтобы xampp control перестал отвечать.

Я изменил memory_limit на -1 в php.ini

Комментарии:

1. Шаг # 1: Не запрашивайте DB внутри цикла.

2. Что еще я могу сделать, мне нужны данные с сайтов, чтобы перейти в базу данных. Спасибо за ваш ответ.

3. Я просто попытался удалить все аспекты скрипта с базой данных и просто вернуть значения, возникает та же проблема.

Ответ №1:

Вы можете сгруппировать свои запросы в 1000 пакетов URL с помощью array_chunk :

 ...
$node_count = count($array);
$urls = array();
for($i = 0; $i < $node_count; $i  )
{
    $urls[] = $array[$i];
}

$urlChunks = array_chunk($urls, 1000);

foreach ($urlChunks as $urlChunk) {
    $curl_arr = array();
    $master = curl_multi_init();

    $chunkSize = sizeof($urlChunk);

    for($i = 0; $i <= $chunkSize; $i  ) {
        $curl_arr[$i] = curl_init($url);
        curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl_arr[$i], CURLOPT_HEADER, 0);
        curl_setopt($curl_arr[$i], CURLOPT_CONNECTTIMEOUT, 120);
        curl_multi_add_handle($master, $curl_arr[$i]);
    }

    do {
        curl_multi_exec($master,$running);
    } while($running > 0);

    for($i = 0; $i <= $chunkSize; $i  ) {
        $results = curl_multi_getcontent  ( $curl_arr[$i]  );

        …….
    }

}