Einzelnen Beitrag anzeigen
  #1  
Alt 31.05.2010, 16:26:28
Benutzerbild von Indyk
Indyk Indyk ist offline
Member
 
Registriert seit: Aug 2006
Ort: Lübeck
Alter: 37
Beiträge: 900
Indyk eine Nachricht über ICQ schicken
curl flaschenhals finden / verstehen.

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