#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] );
…….
}
}