Einzelnen Beitrag anzeigen
  #2  
Alt 01.06.2010, 17:03:55
Benutzerbild von Indyk
Indyk Indyk ist offline
Member
 
Registriert seit: Aug 2006
Ort: Lübeck
Alter: 34
Beiträge: 900
Indyk eine Nachricht über ICQ schicken
AW: curl flaschenhals finden / verstehen.

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($_chCURLOPT_RETURNTRANSFERTRUE);
                
// 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);
            
    } 
Mit Zitat antworten