Hallo Forum,
ich hoffe es findet sich jemand der ein bisschen mehr Ahnung von der curl Materia hat.
Ich versuche mit Curl durch einen multi_handle mehrere Seiten aufzurufen und diese in einer whileschlieife abzuarbeiten sobald eine fertig ist. Leider habe ich bei dieser Methode eine relativ lange verzögerung am ende der Schleife entdeckt und habe keine Idee woher die stammen kann.
Quellcode:
PHP-Code:
// anzahl aller zu importierenden artikel ermitteln
$_iArtikel = $this->model->count_artikel();
$_iArtikel = 50;
echo $_iArtikel.' zu imporiteren'.'<br />';
$this->_iImportiert = 0;
do {
// holt eine feste anzahl an artikeln aus der db (20)
$_aArtikel = $this->model->restore_artikel();
$i = count($_aArtikel);
$_aCh = array();
$_mch = curl_multi_init();
#echo $i.' neue Artikel geholt'.'<br />';
//+++ INIT
$start_init = time();
foreach ($_aArtikel as $_artikel) {
$_url = $this->_url.$_artikel['amazon_asin'];
// curl init and setup
$_ch = curl_init($_url);
curl_setopt($_ch, CURLOPT_RETURNTRANSFER, TRUE);
// multi handle add
curl_multi_add_handle($_mch, $_ch);
// store curl handles
$_aCh[(string) $_ch] = array(
'asin' => $_artikel['amazon_asin'],
'ch' => $_ch,
);
}
$ende_init = time();
$dauer_init = $ende_init - $start_init;
//--- INIT
echo $i.' Urls in '. $dauer_init .'s initialisiert'.'<br />';
//+++ EXEC
$_start_exec = time();
$_running_earlier = 0;
do {
curl_multi_exec($_mch, $_running);
// seite fertig geworden?
if ($_running != $_running_earlier) {
$_running_earlier = $_running;
if ($_info = curl_multi_info_read($_mch)) {
// holt den HTML String
$sHTML = curl_multi_getcontent($_aCh[(string) $_info['handle']]['ch']);
// löscht den handle
curl_multi_remove_handle($_mch, $_aCh[(string) $_info['handle']]['ch']);
// zugehörige id
$sAsin = $_aCh[(string) $_info['handle']]['asin'];
// html verarbeiten
$this->process_html($sHTML, $sAsin);
$_jetzt = time();
$_dauer = $_jetzt - $_start_exec;
echo ' nach '.$_dauer.'s <br />';
$this->_iImportiert++;
}
}
} while ($_running > 0);
$_ende_exec = time();
$_dauer_exec = $_ende_exec - $_start_exec;
//+++ EXEC
echo $i .' Urls in '. $_dauer_exec .'s aufgerufen'.'<br />';
} while ($this->_iImportiert < $_iArtikel);
Meine Frage dreht sich genauer um diesen Teil:
PHP-Code:
//+++ EXEC
$_start_exec = time();
$_running_earlier = 0;
do {
curl_multi_exec($_mch, $_running);
// seite fertig geworden?
if ($_running != $_running_earlier) {
$_running_earlier = $_running;
if ($_info = curl_multi_info_read($_mch)) {
// holt den HTML String
$sHTML = curl_multi_getcontent($_aCh[(string) $_info['handle']]['ch']);
// löscht den handle
curl_multi_remove_handle($_mch, $_aCh[(string) $_info['handle']]['ch']);
// zugehörige id
$sAsin = $_aCh[(string) $_info['handle']]['asin'];
// html verarbeiten
$this->process_html($sHTML, $sAsin);
$_jetzt = time();
$_dauer = $_jetzt - $_start_exec;
echo ' nach '.$_dauer.'s <br />';
$this->_iImportiert++;
}
}
} while ($_running > 0);
$_ende_exec = time();
$_dauer_exec = $_ende_exec - $_start_exec;
//+++ EXEC
Hier eine Beispielausgabe:
Code:
50 zu imporiteren
20 neue Artikel geholt in 1 s
20 Urls in 0s initialisiert
00000 http://www.amazon.de/dp/B002TETL5U nach 9s
00001 http://www.amazon.de/dp/B0013G47J0 nach 10s
00002 http://www.amazon.de/dp/B000CRY3H2 nach 11s
00003 http://www.amazon.de/dp/B002WOZU1Q nach 12s
00004 http://www.amazon.de/dp/B001YXQE70 nach 12s
00005 http://www.amazon.de/dp/B0035018NA nach 13s
00006 http://www.amazon.de/dp/B001AITPVG nach 14s
00007 http://www.amazon.de/dp/B0027W732W nach 15s
00008 http://www.amazon.de/dp/B002TF0R0W nach 15s
00009 http://www.amazon.de/dp/B00303KEJG nach 15s
00010 http://www.amazon.de/dp/B001D8C5V0 nach 15s
00011 http://www.amazon.de/dp/B00007MFXC nach 15s
00012 http://www.amazon.de/dp/B000VEEFBU nach 16s
00013 http://www.amazon.de/dp/B001E9UUF6 nach 16s
00014 http://www.amazon.de/dp/B000MFOGCG nach 17s
00015 http://www.amazon.de/dp/B0009M1LCU nach 17s
00016 http://www.amazon.de/dp/B00371POMI nach 17s
00017 http://www.amazon.de/dp/B000RMBNHA nach 18s
00018 http://www.amazon.de/dp/B001FB5ATE nach 18s
00019 http://www.amazon.de/dp/B000OIRLWI nach 32s
20 Urls in 32s aufgerufen
Wie man an der Ausgabe sehen kann, dauert der letzte aufruf fast so lange wie alle anderen zusammen. Woran könnte das liegen? Verwende ich curl falsch oder vergesse ich etwas? Oder liegt das in der Natur von curl und ich kann daran nicht ändern?
Ich wäre auch über einen Tipp dankbar der mir ein etwas schöneres Weg weist was die resource Id´s der einzelnen handels angeht.
Falls ich den Quelltext unzureichend kommentiert habe stehe ich hier rede und antwort.
Danke für Zeit und Mühe.