Hallo Forum,
nach einer Weile testen und rumprobieren bin ich zu folgenden Erkenntnissen gekommen:
- Der letzte aufruf ist der langsamste weil es nunmal der langsamste der letzt ist, das kann ne sekunde mehr sein oder auch 20.
- Der verwendete code hat ein grooooßer Speicherproblem welches ich mit curl_close() beheben konnte.
- Nur auf running und running_earlier zu reagieren reicht nicht aus da zur selben zeit auch mehrere requests fertig sein können und schon hat man welche übersprungen, also muss man nach der schleife nochmal alle durchgehen die man "übersehen" hat.
Ich poste zum schluss den code mit dem ich ziemlcih zufrieden bin.
(3000 Aufurfe in 60s bei ~900.000 Bytes an Speicher) [HINWEIS: Stark vom der Rechnleistung des Servers abhängig]
PHP-Code:
public function curl_process()
{
// anzahl aller zu importierenden artikel ermitteln
$_iArtikel = $this->model->count_artikel();
$_iArtikel = 100;
if (isset($_GET['asin'])) {
$_iArtikel = 1;
}
echo $_iArtikel.' zu imporiteren'.'<br />';
$this->_iImportiert = 0;
do {
//+++ TIME
$_jetzt = time();
$_dauer = $_jetzt - $this->start;
//--- TIME
echo $_dauer.'s und Bytes '.number_format(memory_get_usage(), 0, ',','.').' <br />';
// 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,
'url' => $_url,
);
}
$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) {
#echo 'running :'.$_running.' '.$_running_earlier.'<br />';
$_running_earlier = $_running;
if ($_mhInfo = curl_multi_info_read($_mch)) {
$_chInfo = curl_getinfo($_aCh[(string) $_mhInfo['handle']]['ch']);
// holt den HTML String
$sHTML = curl_multi_getcontent($_aCh[(string) $_mhInfo['handle']]['ch']);
// löscht den handle
curl_multi_remove_handle($_mch, $_aCh[(string) $_mhInfo['handle']]['ch']);
curl_close($_aCh[(string) $_mhInfo['handle']]['ch']);
// zugehörige id
$sAsin = $_aCh[(string) $_mhInfo['handle']]['asin'];
// html verarbeiten
$this->process_html($sHTML, $sAsin, $_chInfo['http_code']);
unset($_aCh[(string) $_mhInfo['handle']]);
$_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
//+++ LEFTOVERS
if (count($_aCh)) {
$_start_lo = time();
echo 'LEFTOVERS: '.count($_aCh).'<br />';
foreach ($_aCh as $ch) {
#$this->debug($ch);
$_chInfo = curl_getinfo($ch['ch']);
$sHTML = curl_multi_getcontent($ch['ch']);
curl_multi_remove_handle($_mch, $ch['ch']);
curl_close($ch['ch']);
$sAsin = $ch['asin'];
$this->process_html($sHTML, $sAsin, $_chInfo['http_code']);
unset($ch['ch']);
$_jetzt = time();
$_dauer = $_jetzt - $_start_lo;
echo ' nach '.$_dauer.'s <br />';
$this->_iImportiert++;
}
$_ende_lo = time();
$_dauer_lo = $_ende_lo - $_start_lo;
}
//--- LEFTOVERS
echo $i .' Urls in '. $_dauer_exec .'s aufgerufen'.'<br /><hr/>';
} while ($this->_iImportiert < $_iArtikel);
}